2013-07-01 137 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不匹配。