Помощь Преобразование T-SQL в LINQ - PullRequest
1 голос
/ 15 ноября 2010

Есть следующий (не простой) запрос T-SQL, который я пытаюсь преобразовать в LINQ (для использования в выражении L2SQL):

declare @IdAddress int = 481887

select * from 
(
    select top 3 p.* 
    from tblProCon p
    inner join vwAddressExpanded a
    on p.IdPrimaryCity = a.IdPrimaryCity
    where a.AddressType = 3
    and p.IsPro = 1
    and a.IdAddress = @IdAddress
    order by AgreeCount desc
) as Pros

union

select * from 
(
    select top 3 p.* 
    from tblProCon p
    inner join vwAddressExpanded a
    on p.IdPrimaryCity = a.IdPrimaryCity
    where a.AddressType = 3
    and p.IsPro = 0
    and a.IdAddress = @IdAddress
    order by AgreeCount desc
) as Cons

order by ispro desc, AgreeCount desc

В двух словах, у меня есть @ IdAddress - и я пытаюсь найти топ-3 профи и топ-3 кон для этого адреса.

Приведенный выше запросработает как положено.Я не совсем уверен, как преобразовать его в запрос LINQ (никогда раньше не делали объединения с LINQ).Я даже не знаю с чего начать.:)

Стиль запроса / лямбда принят (предпочтителен стиль запроса, для удобства чтения).

Также - у меня установлен LinqPad - но я не уверен, как"конвертировать T-SQL в Linq" - есть ли вариант для этого?Бонус upvote будет награжден за это.:)

Приведенный выше запрос T-SQL работает хорошо, и этот запрос L2SQL будет выполняться часто, поэтому он должен работать довольно хорошо.

Оцените помощь.

Ответы [ 2 ]

2 голосов
/ 15 ноября 2010
var baseQuery = (from p in db.tblProCon
                join a in db.vwAddresssExpanded
                on p.IdPrimaryCity equals a.IdPrimaryCity
                where a.AddressType == (byte) AddressType.PrimaryCity &&
          a.IdAddress == idAddress
          order by p.AgreeCount descending
                select p);

var pros = baseQuery.Where(x=> x.IsPro).Take(3);
var cons = baseQuery.Where(x=> !x.IsPro).Take(3);

var results = pros
               .Union(cons)
               .OrderByDescending(x => x.IsPro)
               .ThenByDescending(x => x.AgreeCount)
               .ToList();
0 голосов
/ 15 ноября 2010

Вы можете вызвать (some query expression).Union(other query expression).
Вы также можете (эквивалентно) написать Enumerable.Union(some query expression, other query expression).

Обратите внимание, что оба выражения должны возвращать один и тот же тип.


AFAIK, нет инструментов для автоматического преобразования SQL в LINQ.
(Для нетривиального SQL это нетривиальная задача)

...