【问题标题】:How can I do this formula in LINQ?如何在 LINQ 中执行此公式?
【发布时间】:2015-06-18 15:41:41
【问题描述】:

我的公式如下所示:

Conversion = Settled / (Settled + Cancelled)

如何在 LINQ 语句中执行此操作?

这是我的代码:

WIP = g.Where(v => v.StatusCategoryID == 40).Sum(c => c.Amount) ?? 0,
Settled = g.Where(v => v.StatusCategoryID == 11).Sum(c => c.Amount) ?? 0,
Cancelled = g.Where(v => v.StatusCategoryID == 10).Sum(c => c.Amount) ?? 0,

【问题讨论】:

  • 创建两个包含 Settled 和 Canceled 总和的变量,然后计算一下? StatusCategoryID == 40 有什么用?也许使用foreach() 显示一个非常小的示例输入和工作代码。
  • 这是一组 linq 语句,所以我不太确定你在问什么。此外,您的语法对于 where 子句无效。这些逗号是干什么用的?
  • 为什么你需要在 linq 中这样做呢?目前尚不清楚您到底想在这里实现什么。
  • @JNYRanger 他正在设置多个变量。
  • 我不需要在 LINQ 中这样做,但这样做会更容易:好吧,显然不需要,否则你不会问。

标签: c# linq


【解决方案1】:

你可以用Aggregate 尝试这样的事情(虽然感觉有点辱骂):

var agg = g.Aggregate(new { wip = 0, settled = 0, cancelled = 0 }, (a, curr) => 
{
    return new 
    { 
        wip = a.wip + a.StatusCategoryID == 40 ? curr.Amount : 0, 
        settled = a.settled + a.StatusCategoryID == 11? curr.Amount : 0, 
        cancelled = a.cancelled + a.StatusCategoryID == 10? curr.Amount : 0, 
    };
});

然后你可以:

var Conversion = agg.settled / (agg.settled + agg.cancelled);

和:

var WIP = agg.wip;

这里的优点是您在一个循环中汇总了所有三个类别。我不确定我是否发现这比仅使用 foreach 循环要好得多。

【讨论】:

  • 当然,除非原始的 IEnumerable 代表数据库查询、昂贵的延迟工作或迭代时并不总是产生相同值的东西,否则没有任何理由避免首先迭代它多次,使用或不使用 LINQ。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
相关资源
最近更新 更多