Linq to Entities 4.0 - Оптимизированный запрос и несколько обращений к базе данных в одном запросе - PullRequest
1 голос
/ 05 августа 2010

Может кто-нибудь сказать мне, если следующий запрос вызывает базу данных несколько раз или только один раз?

var bizItems = new
{
    items = (
        from bl in db.rc_BusinessLocations
        orderby bl.rc_BusinessProfiles.BusinessName
        select new BusinessLocationItem
        {
            BusinessLocation = bl,
            BusinessProfile = bl.rc_BusinessProfiles,
            Products = bl.rc_InventoryProducts_Business
        })
        .Skip(pageSkip).Take(pageSize),

    Count = db.rc_BusinessLocations.Count()
};

Мне действительно нужно получить Count () из запроса, и я не смог найти другой способчтобы сделать это, если у вас есть более оптимизированный код, не стесняйтесь делиться им!

Заранее спасибо!

Гвар

Ответы [ 3 ]

3 голосов
/ 05 августа 2010

Это полностью зависит от того, что вы делаете с переменной bizItems, потому что после запуска только этого кода будет выполняться только запрос COUNT(*). Это связано с тем, что item содержит IQueryable, который представляет собой описание запроса (намерение выполнить), а не результат операции. Запрос будет запущен, только когда вы начнете повторять этот запрос, используя foreach или оператор, такой как .Count(). Помимо этого, свойства BusinessProfile и Products, вероятно, также будут содержать IQueryable s.

Итак, давайте посмотрим, что вы можете сделать с этим кодом:

foreach (var item in bizItems.items)
{
    Console.WriteLine(item.BusinessLocation.City);

    foreach (var profile in item.BusinessProfile)
    {
        Console.WriteLine(profile.Name);
    }

    foreach (var product in item.Products)
    {
        Console.WriteLine(product.Price);
    }

    Console.WriteLine(item.Count);
    Console.WriteLine();
}

Итак, если вы спросите меня снова, глядя на этот код, сколько запросов будет отправлено в базу данных, мой ответ: 2 + 2 * количество элементов в bizItems.items. Таким образом, количество запросов будет между 2 и (2 + 2 * pageSize).

1 голос
/ 05 августа 2010

Вам следует проверить сообщение Скотта Гатри об использовании LINQ to SQL Debug Visualizer. Это позволит вам точно увидеть SQL, который будет сгенерирован из вашего оператора LINQ.

0 голосов
/ 05 августа 2010

Это обязательно приведет к двум вызовам.

...