C# SQL到LINQ转换器
我有一个SQL,很难将它转换为LINQ。有没有其他工具可以将SQL转换为LINQ?我听过Linqer并尝试过它,但它不允许您查询多对多关系表的连接/联接表。在任何情况下,我都需要将SQL转换为LINQ甚至lambdaC# SQL到LINQ转换器,c#,sql,linq,linq-to-entities,entity-framework-4.1,C#,Sql,Linq,Linq To Entities,Entity Framework 4.1,我有一个SQL,很难将它转换为LINQ。有没有其他工具可以将SQL转换为LINQ?我听过Linqer并尝试过它,但它不允许您查询多对多关系表的连接/联接表。在任何情况下,我都需要将SQL转换为LINQ甚至lambda SELECT A.* FROM ( SELECT TOP 10 T2.ID, T2.Name, SUM(T1.Column1 + T1.C
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);
旧线程,但相关:
我做了一些挖掘/询问了几位同事,看起来Linqer仍然是唯一可以用于此的工具至少是唯一一个在对话中出现的知名度足够高的工具
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语句,所以不要认为它第一次就可以工作,但至少这是一个很好的起点。关于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();
那么,你试过哪些不起作用的?因为否则我们可能会感到困惑,认为你在要求我们为你做你的工作:很抱歉,以下是我尝试过但没有产生我期望的结果:var query=db.Table1.Includee=>e.Table2.Wherex=>x.Date>='2011-11-09 00:00:00'&&x.DateCreated y y.Table2.Table3.Anyu=>u.Id==1.take10 SQL查询中的表3是多对多关系表的连接/连接表。您介意将其添加到问题中吗?+1但我建议在使用查询语法/lambdas时保持一致性,尤其是在一行上编写查询语法一开始让读者感到困惑:这里的问题是表3是多对多关系的联接表,它在我的C实体上没有类。运气好吗?为什么table3没有C类?它不是一个实体,它是EF 4.1在Table1和Table2之间建立的一个多对多联接表。不管怎样,我使用查询得到的结果只是修改了一些小东西。ThanksI发现将复杂查询分解为较小的查询非常有用+