Linq-запрос выполняет все вызовы для получения данных таблицы внешнего ключа - PullRequest
3 голосов
/ 12 марта 2011
from d in Customers
select d;

Этот запрос делает вызов для каждого customerId, чтобы получить заказы, где customerId = этот customerId.

Это делает вызов медленным и длинным, мне не нужны данные заказов. Как это отключить?

Дополнительные детали:

Я делаю условно

if (flag)
{
   return (from d in Customers
           select d).ToList();
}    
else
{
   return (from d in Customers
           where d.Orders.Count > 10
           select d).ToList();
}

Даже в запросе if он вызывает все заказы каждого Клиента, которые я хочу предотвратить в обоих случаях.

Ответы [ 3 ]

3 голосов
/ 12 марта 2011

Как намекнул Крейг Штунц , вопрос здесь в том, откуда взялась Customers и какого она типа. Если это объект в памяти, фильтрация будет происходить в памяти; если это объектный запрос, это произойдет на вашем сервере баз данных, что вам и нужно. Мы не можем увидеть достаточно вашего кода, чтобы знать о Customers, но я предложу правильный и неправильный пример:

Справа (более или менее):

using (var context = new MyContextType())
{
    var Customers = context.Customers;

    var query = from d in Customers
                select d;

    if (!flag)
    {
       query = from d in query
               where d.Orders.Count > 10
               select d;
    }

    return query.ToList();
}

Неправильно:

using (var context = new MyContextType())
{
    var Customers = context.Customers.ToList(); // ToList triggers the query

    var query = from d in Customers
                select d;

    if (!flag)
    {
       query = from d in query
               where d.Orders.Count > 10
               select d;
    }

    return query.ToList();
}

Видите разницу? Это context.Customers.ToList(). Он запускает полный запрос и загружает все в память, прежде чем вы сможете его отфильтровать. Убедитесь, что у вас полностью собранный запрос, включая логику where, прежде чем запускать на нем ToList().

@ Крейг - Надеюсь, ты не возражаешь, чтобы я подхватил твою идею и продолжил с ней. Я бы проголосовал за ваш ответ, если бы у вас был один.

1 голос
/ 12 марта 2011

Отправленный вами запрос не делает этого.Доступ к свойству Orders экземпляра клиента может сделать это.Не обращайтесь к свойству Orders, и все будет в порядке.

Если ваш код не обращается к свойству Orders, возможно, некоторый код сериализации ... не позволяет этому коду получить данные -распоряжаться контекстом данных.Чтобы этот код не имел свойства Orders для доступа, удалите связь в dbml.

0 голосов
/ 14 марта 2011

Я пошел в dataModel и удалил свойство Orders из таблицы Customers. и теперь он работает нормально, есть только один звонок. Но я больше не могу делать e.Orders.Count, но вместо решения этой проблемы я бы предпочел использовать соединение.

...