как этот SQL можно сделать в LINQ? - PullRequest
0 голосов
/ 12 апреля 2011

У меня есть этот простой запрос SQL ...

-- BestSeller
SELECT TOP(1) v.make, v.model, COUNT(v.make) AS NoSold
FROM Vehicles v
group by v.make, v.model
order by NoSold DESC

Я использую фреймворк для сущностей и хочу сделать то же самое, используя linq.пока у меня есть ...

                var tester = (from v in DB.VP_Historical_Vehicles
                         group v by v.make into g
                         orderby g.Count() descending
                         select new { make = g.Key, model = g, count = g.Count() }).Take(1);

            foreach(var t in tester)
            {
                BestSeller.Make = t.make;
                BestSeller.Model = t.make;
                BestSeller.CountValue = t.count;
            }     

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

любые предложения?

спасибо

truegilly

Ответы [ 3 ]

2 голосов
/ 12 апреля 2011

Группировка по составному ключу.

var t = (
    from v in DB.VP_Historical_Vehicles
    group v by new { v.make, v.model } into g
    orderby g.Count() descending
    select new { make = g.Key.make, model = g.Key.model, count = g.Count() }
    )
    .First();

BestSeller.Make = t.make;
BestSeller.Model = t.make;
BestSeller.CountValue = t.count;
0 голосов
/ 12 апреля 2011

благодаря ответу Скотта Вайнштейна я смог заставить его работать

прокомментируйте, если есть более эффективный способ сделать это ...

        VehicleStatsObject BestSeller = new VehicleStatsObject();

        using (var DB = DataContext.Get_DataContext)
        {
            var t = (from v in DB.VP_Historical_Vehicles
                     group v by new { v.make, v.model } into g
                     orderby g.Count() ascending
                     select new { make = g.Key.make, model = g.Key.model, count = g.Count() }).OrderByDescending(x => x.count).First();

                BestSeller.Make = t.make;
                BestSeller.Model = t.model;
                BestSeller.CountValue = t.count;                              
        }

        return BestSeller;
0 голосов
/ 12 апреля 2011

Проверьте, какие запросы он выполняет, когда вы запускаете его с LINQ.

Я подозреваю, что вы orderby g.Count() descending могли бы выполнять COUNT запрос для каждой строки , и это заняло быснижение производительности, если не сказать больше.

При работе с EF всегда проверяйте, что ваши операторы LINQ генерируют в терминах запросов.Очень легко создавать запросы, которые приводят к сценарию n + 1 .

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