【发布时间】:2019-06-25 22:37:32
【问题描述】:
我想要一种干净的方法来向现有的 linq 语句添加条件。我有一个新变量personContactRoleId,它将为零或不为零。
context.PersonContactRoles
.Where(pcr => pcr.PersonId == personId);
.ToList()
.ForEach(pcr =>
{
// a lot of code
}
我能够使用 if 语句通过 iqueryable 延迟执行来解决它,但它看起来相当丑陋并且性能可能更低?有什么更好用的吗?
var query = context.PersonContactRoles
.Where(pcr => pcr.PersonId == personId);
if(personContactRoleId != 0)
{
query = query.Where(b => b.PersonContactRoleId == personContactRoleId);
}
var results = query.ToList();
results.ForEach(pcr =>
{
// a lot of code
}
同样,这是可行的,但正在寻找一种更清洁的方法
【问题讨论】:
-
第二个代码示例中的
if语句不会使事情变慢。怎么可能…… -
@elgonzo 我敢打赌,很多人没有正确意识到与 LINQ 相关的延迟加载,并认为第一个
query已处理,然后if语句已处理,如果它落入其中然后修改query。如果您熟悉这一切是如何工作的,这是显而易见的事情,但如果您不熟悉,那么您可能会认为它遵循我刚才描述的模式,从而使您认为它很慢并且实际上是在枚举查询两次,不止一次。只是我的猜测。 -
@gilliduck,我的评论显然是针对 OP 的。 Chad 本人已经意识到 Linq 可查询对象的延迟执行性质(不包括产生单例值的查询)。请注意问题中用粗体写的文字。
标签: c# .net linq linq-to-sql linq-to-entities