2013-07-01 177 views
0

我有一個名爲Outweigh的表,它有大約50個字段。我需要創建一個類似於這個SQL查詢的Linq查詢。將SQL語句轉換爲Linq?

SELECT DISTINCT Product, 
    Medication, 
    SUM(NettWeight) as NettWt, 
    COUNT(DISTINCT CustCode) as Customer, 
    COUNT(DISTINCT DktNo)as DktNo 
FROM outweigh 
GROUP BY Product, Medication 
ORDER BY Product, Medication 

結果如下:

enter image description here

我已經寫了一些代碼,如下這是不是很有效。

lstOutWeigh = dbContext.Outweighs 
         .Where(o => o.DateOut >= StartDate && o.DateOut <= EndDate) 
         .ToList(); 

    var k = from t in lstOutWeigh select new {t.Product,t.Medication,t.NettWeight}; 
    var l = from t in k 
      group t by new { t.Product, t.Medication } into g 
      select new someclass 
      { 
       prod =g.Key.Product, 
       med = g.Key.Medication, 
       tonnes = (double) g.Sum(x => x.NettWeight), 
       count = g.Count() 
      }; 

有什麼建議嗎?

+1

http://sqltolinq.com/ – SQLMason

+1

什麼是lstOutWeigh?它是如何填充的?您可能會無意中將數據庫中的所有記錄撤回,並將linq轉換爲對象,而不是將linq轉換爲實體。 – gareththegeek

+2

「效率不高」似乎是你問題的關鍵部分,但是這並不能提供足夠的細節讓我們真正去幫助。如果您的Linq聲明有效,但您要求提供性能幫助,請更清楚。 –

回答

0
 var t = (from p in Context.outweigh 
       group p by new {p.Product,p.Medication} into g 
       select new {Product= t.Product,Medication=t.Medication, NettWt = g.Sum(x => x.NettWeight),Customer=g.Count()) 
      .Distinct().orderby(new {p.Product, p.Medication}); 
+0

我認爲外面的區別是虛假的,你忽略了可能相關的區別。如果我們在分組中沒有兩行可以有相同的組。 – Jodrell

1

正如有人提到,http://sqltolinq.com/效果很好。

http://www.linqpad.net/也是另一個很棒的工具(我/我們個人在我工作的地方使用)可以幫助您在這些類型的語句之間進行轉換 - 即使使用Lambda表達式 - 如果您願意的話 - 在我看來是其中之一使用LINQ查詢的最簡單方法。

+0

很多事情都能正常工作,但是,由於要求提供工具建議的問題不屬於主題,因此提供問題的答案也必須是。 – Jodrell

1

喜歡的東西,

db.Outweighs.GroupBy(ow => new { ow.Product, ow.Medication }) 
    .OrderBy(g => g.Key) 
    .Select(g => new 
     { 
      g.Key.Product, 
      g.Key.Medication, 
      NettWt = g.Sum(ow => ow.NettWeight), 
      Customer = g.Select(ow => ow.CustCode).Distinct().Count(), 
      DktNo = g.Select(ow => ow.DktNo).Distinct().Count() 
     }) 

等同於你在問題出現的SQL。但是,您呈現的Linq-To-Sql不匹配。