Конвертер SQL в LINQ - PullRequest
       30

Конвертер SQL в LINQ

2 голосов
/ 10 ноября 2011

У меня есть SQL, и мне трудно конвертировать его в LINQ. Существуют ли другие инструменты, которые могут конвертировать SQL в LINQ? Я слышал Linqer и попробовал его, но он не позволяет вам делать запросы к таблице Junction / Join таблиц отношений «многие ко многим». В любом случае вот SQL, который мне нужно преобразовать в LINQ или даже лямбду.

SELECT A.*
FROM
(              SELECT  TOP 10   T2.ID,
                T2.Name,                        
                SUM(T1.Column1 + T1.Column2 + T1.Column3) AS Total
FROM POS.dbo.Table1 T1
INNER JOIN POS.dbo.Table2 T2 on T2.ID = T1.ID
WHERE T2.ID IN 
(
    SELECT ID FROM POS.dbo.Table3 WHERE [Id] = 1
)
AND [Date] BETWEEN '2011-11-09 00:00:00' AND '2011-11-09 23:59:59'
GROUP BY T2.ID, T2.Name
ORDER BY Total DESC
) A
ORDER BY Name ASC

Вот моя первая попытка:

var query = db.Table1
              .Include(e => e.Table2)
              .Where(x => x.Date >= '2011-11-09 00:00:00'
                       && x.DateCreated <= '2011-11-09 23:59:59')
              .Where(y => y.Table2.Table3.Any(u => u.Id == 1))
              .Take(10);

Ответы [ 3 ]

5 голосов
/ 10 ноября 2011

Одна из вещей, которые мне больше всего нравятся в Linq, это то, что он объединяет запросы вместе, поэтому я разбиваю сложный запрос на подзапросы и позволяю Linq объединить их все.

Используя эту базу, делает что-то вроде этой работы.

DateTime startDate = new DateTime(2011,11,9);
DateTime endDate   = new DateTime(2011,11,9,23,59,59);

var table3Ids = (from r in Pos.dbo.Table3 where id = 1 select r.id) ;

var query1  = 
(
    from t1 in Pos.dbo.Table1 
    where t1.Table2.Id == 1 && t1.Date >= startDate && t1.Date <= endDate
    where table3Ids.Contains(t1.Table2.Id)
    group t1 by new { t1.Table2.Id , t1.Table2.Name} into results

    select new 
    { 
        results.Key.Id , 
        results.Key.Name , 
        Total = results.Sum(r=> (r.Column1 + r.Column2 + r.Column3)) 
    } 
);


var query2 = (from r in query1 orderby r.Total descending select r).Take(10);
var query3 = (from r in query2 orderby r.Name select r);

var list = query3.ToList(); 
0 голосов
/ 10 ноября 2011

Вот мой выстрел - это немного сложно, не зная реальной структуры данных или ожидаемых результатов:

var query = db.Table1
    .Join(db.Table2, table1 => table1.Id, table2 => table2.Id, (t1, t2) => new { 
        Id = t2.Id, 
        Name = t2.Name, 
        Total = (t1.Column1 + t1.Column2 + t1.Column3), 
        Date = t1.Date //you didn't use a table alias for this field, so I'm not sure which table it comes from
        })
    .Where(x => x.Date >= new DateTime(2011, 11, 9)
                && x.DateCreated <= new DateTime(2011, 11, 9, 23, 59, 59))
    .Join(db.Table3, x => x.Id, table3 => table3.Id, (x, t3) => new {
        Id = x.Id,
        Name = x.Name,
        x.Total
    })
    .Where(x => x.Id == 1)
    .OrderByDescending(x => x.Total)
    .ThenBy(x => x.Name)
    .Take(10)
    .ToList()

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

0 голосов
/ 10 ноября 2011

Старый поток, но соответствующий: Инструмент SQL для LINQ

Я немного покопался / попросил пару коллег, и похоже, что Linqer по-прежнему является единственным доступным инструментом для этого (по крайней мере, единственным, достаточно известным, чтобы говорить в разговоре)

...