SQL到LINQ转换器

gna*_*yan 2 c# sql linq linq-to-entities entity-framework-4.1

我有一个SQL,很难将它转换为LINQ.有没有其他工具可以将SQL转换为LINQ?我听说Linqer并尝试了它,但它不允许您查询多对多关系表的Junction/Join表.在任何情况下,这是我需要转换为LINQ甚至lambda的SQL.

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
Run Code Online (Sandbox Code Playgroud)

这是我的第一次尝试:

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);
Run Code Online (Sandbox Code Playgroud)

sgm*_*ore 5

我最喜欢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(); 
Run Code Online (Sandbox Code Playgroud)