2017-02-15 10 views
1

Iている次のSQL文このSQLクエリをLINQクエリに変換する方法?

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

約400件のレコード。 –

+0

あなたは3倍(少なくとも)速くなるようにこのSQLを書く良い方法があることは知っていますか?サブクエリを使用する必要がないためです。 – Hogan

答えて

-1

簡単な答えは、Entity Frameworkやそれに類するORMを使用していると仮定した場合、少なくともパフォーマンス面ではありませんか?

This postは、LINQでサブクエリを処理する方法を説明しています。私が知っている限り、これを "セマンティック" LINQで行う方法はありません。この記事で提案されているメソッドの問題は、サブクエリがメインクエリと一緒に実行されず、パフォーマンスが悪夢であるということです。

私はいつもT-SQLでストアドプロシージャを記述し、それをEFでマッピングすることでこの状況を処理しました。

+0

です。ビューはprocsではありません。ビューは合成可能です...プロクセスはできません。 –

+1

この回答の問題は答えではなく、元のSQLがサブクエリを持たないように簡単にリファクタリングできるという事実を無視するということです。 linqでこれを書き直すのは簡単です。 – Hogan

0

あなたのsqlクエリは非常に難しいので、私はあなたに完全な解決策を与えることはできません。この複雑なSQLクエリを簡単に処理できる小さなクエリに分割するためのアイデアを提供しなければなりませんでした。
3つの部分があり、D、T_DIZ、T_OMUとして簡略化しました。 それから私はそれらを別々に単純化しなければなりません。また、クエリのスキームの図がある場合は、Groupby、Coalesce、LEFT OUTER JOINを考慮する必要があります。 それぞれquery1、query2、query3という3つのクエリがあります。

qurey1 = 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(). 

時間の理由で解決策にはまだ少しの欠点があります。これがあなたに役立つことを願っています。

+0

SqlMethods.Like(b.ATUR、 "%DIZ%")の代わりに、b.ATUR.Contains( "DIZ")を使用できます。そしてCoalesce = ??と等価です。だからDIZ = g == null? 0:g.DIZはDIZ = g?DIZに変換されます。 0 –

+0

はい、あなたは良い提案をしました。 –

関連する問題