我有以下SQL语句
SELECT D.*, COALESCE(T_DIZ.adet, 0) AS DIZ, COALESCE(T_OMU.adet, 0) as OMUZ
FROM
(SELECT A.DOK,COUNT(DISTINCT GNL) AS toplam FROM CKS A GROUP BY A.DOK ) AS D
LEFT OUTER JOIN (
SELECT DOK, ATUR,count(DISTINCT HST)as Adet, COUNT(DISTINCT GNL) AS adet FROM CKS
WHERE ATUR LIKE '%DIZ%'
GROUP BY DOK, ATUR
) T_DIZ ON(T_DIZ.DOK = D.DOK)
LEFT OUTER JOIN (
SELECT DOK, ATUR,count(DISTINCT HST)as Adet, COUNT(DISTINCT GNL) AS adet FROM CKS
WHERE ATUR LIKE '%OMU%'
GROUP BY DOK, ATUR
) T_OMU ON(T_OMU.DOK = D.DOK)
此查询结果相同
SELECT DISTINCT(DOK), (COUNT(DISTINCT GNL) ) AS TOP,
(CASE WHEN ATUR LIKE '%DIZ%' THEN COUNT(DISTINCT GNL) ELSE 0 END) AS DIZ,
(CASE WHEN ATUR LIKE '%OMU%' THEN COUNT(DISTINCT GNL) ELSE 0 END) AS OMU
FROM S_GC_UST
WHERE GC = 'C'
GROUP BY DOK, ATUR, TRH
有人可以帮助我将此声明转换为LINQ吗?
谢谢。
答案 0 :(得分:0)
您的SQL查询非常困难,我无法为您提供完整的解决方案。我不得不给你一些想法,将这个复杂的SQL查询拆分成可以轻松处理的小查询。
你有三个部分,我简化为D,T_DIZ,T_OMU。
然后我必须分别简化它们。在得到查询的方案图后,你应该更好地考虑Groupby,Coalesce,LEFT OUTER JOIN。
我们分别有三个查询,如query1,query2,query3。
query1 = from a in CKS Group a by Key DOK into Group
select DOK = Group.DOK,
TOPLAM = Group.Select(x => x.GNL).Distinct().Count()
query2 = from b in CKS
where SqlMethods.Like(b.ATUR, "%DIZ%")
Group b by new Key {DOK, ATUR } into Group
select DOK = Group.DOK,
ATUR = Group.ATUR,
Adet = Group.Select(x => x.HST).Distinct().Count(),
adet = Group.Select(x => x.GNL).Distinct().Count()
//the same way of query2, you can get query3.
//Then you can use a query23 to unit all of query2 and query3
query23 = (from x in query2 select new {DIZ= x.A, OMUZ = 0})
.Concat( from y in query3 select new {DIZ = 0, DIZ = y.B} );
//At last, you can put query1 and query23 together.
query123 = from e in query1
join f in query23
on e.DOK equals f.DOK
into query
from g in query.DefaultIfEmpty()
select new { toplam = g.toplam ,
DIZ= g==null ? 0:g.DIZ ,
OMUZ = g==null?0:g.OMUZ };
//and then
var result = query123.ToList().
由于时间原因,解决方案仍有一些小缺点。希望这对你有所帮助。
答案 1 :(得分:-1)
简单的答案是你没有,至少以一种高效的方式假设你使用实体框架或类似的ORM。
This post描述了如何处理LINQ中的子查询。据我所知,没有可能的方法在"语义" LINQ。该帖子中建议的方法的问题是子查询不会与主查询一起执行,并且性能是一场噩梦。
我总是通过在T-SQL中编写存储过程并通过EF映射来处理这种情况。