Lambda 表达式中的 SQL WHERE 等价物是啥?

Posted

技术标签:

【中文标题】Lambda 表达式中的 SQL WHERE 等价物是啥?【英文标题】:What's the equivalence of an SQL WHERE in Lambda expressions?Lambda 表达式中的 SQL WHERE 等价物是什么? 【发布时间】:2010-11-05 06:58:27 【问题描述】:

这是我所拥有的:

decimal sum = _myDB.Products.Sum(p => p.Price).GetValueOrDefault();

我还有两个约会:DateTime startDateTime end 我想检索开始和结束之间所有产品价格的总和,但我不知道如何将变量合并到 lambda 方程中。

如何将变量合并到 lambda 方程中以给出一些规范?

【问题讨论】:

【参考方案1】:

使用Enumerable.Where

decimal sum = _myDB.Products
                   .Where(p => (p.Date >= start) && (p.Date <= end) )
                   .Sum(p => p.Price)
                   .GetValueOrDefault();

【讨论】:

在实现方面同意,但是这样的查询在多行上会更清晰。排列点:) 关于格式的好点 - 为了保持一致性,我只是坚持使用他原来问题的格式方法,但这是我通常在自己的代码中编写它的方式。 @Jon:完成。直到现在才看到您的评论。 好点乔恩。总有一些东西要学(甚至从 cmets 那里)。哈哈:)【参考方案2】:
 decimal sum = _myDB.Products
.Where(p => p.Start >= mystartDate && p.End <= myenddate)
.Sum(p => p.Price)

请原谅我的语法。但是,我希望你能明白。

编辑:根据 Reed 的建议进行了更正。 旧代码(不正确)

 decimal sum = _myDB.Products
.Sum(p => p.Price)
.Where(p => p.Start >= mystartDate && p.End <= myenddate)

【讨论】:

Where 子句需要放在 Sum 之前。 Sum 返回一个小数,你不能对一个小数做".Where"。 伙计们,这会有不同的工作方式(即不同于 WHERE 和 SUM)吗? 这根本不会编译。您不能在单个值上运行 .Where,这是 Sum() 返回的值。 没问题。当您使用这样的流畅接口时,每个方法都会返回一个新对象。对于 Where() 之类的方法,它返回一个新的 IEnumerable,这就是您可以将它们“链接”在一起的原因。 .Sum() 只返回一个值(十进制),所以你不能在 Sum() 之后执行另一个期望 IEnumerable 的方法 【参考方案3】:
_myDB.Products
.Where(p => p.start >= "somevalue")
.Where(p => p.end <= "somevalue")
.Sum(p => p.Price).GetValueOrDefault();

【讨论】:

没有必要有两个带有独立谓词的 where 子句。

以上是关于Lambda 表达式中的 SQL WHERE 等价物是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Lambda表达式Contains方法(等价于SQL语句中的like)使用注意事项

lambda表达式中的Select和Where的区别?

如何即时将 lambda 表达式转换为 Sql 查询?

Lambda 表达式中的多个 Where 子句

WHERE 子句中的 Lambda 表达式未按预期工作

来自不同类的 Lambda 表达式中的多个 Where 子句