在 Linq to SQL 中使用求和

Tim*_*Tim 0 c# linq-to-sql

我有一个 SQL 命令,我试图将其转换为 LINQ to SQL 命令,但遇到了困难。

我的 SQL 命令如下:

SELECT purchs.iclientid, ifeatureid, AddnlOptionList FROM purchs
WHERE AddnlOptionList <> ''
GROUP BY purchs.iclientid, ifeatureid, AddnlOptionList
HAVING (SUM(noptions) > 0)
Run Code Online (Sandbox Code Playgroud)

我已经成功地做到了以下示例:

var q =
   from purchs in db.Purchases
   group q by purchs.noptions into g
   where purchs.AddnlOptionList != ""
      && g.Sum(x => x.noptions) > 0
   select q;
Run Code Online (Sandbox Code Playgroud)

但是,我似乎被困在 q 组中,出现以下两个错误:

Cannot use local variable 'q' before it is declared

Cannot convert lambda expression to type 'System.Collections.Generic.IEqualityComparer<decimal?> because it is not a delegate type
Run Code Online (Sandbox Code Playgroud)

这里的一个例子说这应该有效,尽管它使用了连接,而我不是。任何帮助,将不胜感激。

解决方案

我不得不稍微修改 Xiaoy312 的代码以获得我想要的东西,所以我想我会在这里发布它,希望它可以在将来对某人有所帮助。谢谢@Xiaoy312 的帮助。

var updates = db.Purchases
   .Where(p => p.AddnlOptionList != "")
   .GroupBy(p => new { p.iclientid, p.ifeatureid, p.AddnlOptionList })
   .Where(g => g.Sum(p => p.noptions) > 0)
   .Select(g => g.Key);
Run Code Online (Sandbox Code Playgroud)

Xia*_*312 5

您不能将WHEREandHAVING子句放入一个where. 我不太熟悉其他语法,所以这里是方法语法一:

var results = db.Purchases
    .Where(p => p.AddnlOptionList != "")
    .GroupBy(p => new { p.notions, p.iclientid, p.ifeatureid })
    .Where(g => g.Sum(p => p.notions) > 0)
    .SelectMany(g => g)
Run Code Online (Sandbox Code Playgroud)

编辑:转换为 Linq 语法。

var results = from p in db.Purchases
              where p.AddnlOptionList != ""
              group p by new { p.notions, p.iclientid, p.ifeatureid } into g
              where g => g.Sum(p => p.notions) > 0
              from p in g
              select p;
Run Code Online (Sandbox Code Playgroud)

编辑:我错过了阅读 sql 命令。这意味着只拉组,而不是每个组中的每个项目。

// method syntax
db.Purchases
    .Where(p => p.AddnlOptionList != "")
    .GroupBy(p => new { p.notions, p.iclientid, p.ifeatureid })
    .Where(g => g.Sum(p => p.notions) > 0)
    .Select(g => g.Key)

// query syntax
    from p in db.Purchases
    where p.AddnlOptionList != ""
    group p by new { p.notions, p.iclientid, p.ifeatureid } into g
    where g.Sum(p => p.notions) > 0
    select new { g.Key.notions, g.Key.iclientid, g.Key.ifeatureid };
Run Code Online (Sandbox Code Playgroud)