Entity Framework выполняет ненужные запросы SQL, в то время как все данные уже извлечены в памяти? - PullRequest
0 голосов
/ 25 октября 2018
var logs = myContext.Logs.Where(x => ...).ToList();
var objectIds = logs.Select(x => x.ObjectId).Distinct().ToArray();
var objects = myContext.MyObjects.Where(x => objectIds.Contains(x.ID)).ToList();

foreach (MyObject myObject in objects)
{
    myObject.Logs = logs.Where(x => x.ObjectId == myObject.ID).ToList();
}

Когда я смотрю на сгенерированные запросы, у меня есть:

SELECT * FROM LOGS WHERE ...

и

SELECT * FROM MYOBJECTS WHERE ID IN (...)

Это то, что я хочу, но у меня есть ненужный запрос для каждой итерации после

SELECT * FROM LOGS WHERE OBJECTID = ...

Я предполагал, что из первых двух запросов все данные были загружены, так зачем запускать новые запросы в базе данных?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Как, не предполагая, что это ЕДИНСТВЕННЫЙ экземпляр, когда-либо работающий над ним, EF должен знать, что ВСЕ данные загружены в память, если в базе данных не было создано никаких дополнительных данных?

Это ядропроблема.EF не делает никаких предположений по этому поводу, поэтому делает еще один запрос.Между ними есть время.

0 голосов
/ 25 октября 2018

Когда Entity Framework загружает отслеживаемые объекты, он добавляет их в локальный репозиторий, к которому можно получить доступ через context.Table.Local.Выполнение запросов вне локального репо всегда будет переводиться в SQL и будет выполняться на ядре базы данных.При этом я считаю, что комбинированный запрос с объединениями более уместен в вашей ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...