如何在Enumerable方法中添加条件语句
本文关键字:添加 条件 语句 方法 Enumerable | 更新日期: 2023-09-27 18:01:42
我可能试图在这里做一些可能不可能的事情。是否有可能在我正在构建的表达式上注入一些逻辑到SingleOrDefault
枚举方法中?
问题是,除了用于提取结果的参数之外,我将有(2)个相同的查询结果。
表示ID
和ID2
值并非在所有条件下都存在。我试图创建一个单一的表达式,将缩小基于条件的结果。以下是我试图完成的事情:
//'ID' and 'ID2' sre parameters passed into method
var query = Repository.GetQuery<Person>()
.Include(x => x.PersonDetail)
.SingleOrDefault(
if (String.IsNullOrWhiteSpace(ID))
{
x => x.PersonDetail.ID2 == ID2;
}
else
{
x => x.PersonDetail.ID == ID;
}
);
现在它将无法构建并产生以下错误:
无法解析符号PersonDetail
好吧,所以我可能已经完全解释了实现,但本质上我可以做一些像我上面尝试的事情,或者我必须写(2)单独的查询,提取相同的数据,并保持"决定逻辑"外部的表达式?
任何帮助都是感激的,谢谢!
分支条件已知,因此可以(并且应该)将分支从lambda中拉出:
var query = Repository.GetQuery<Person>()
.Include(x => x.PersonDetail);
if (String.IsNullOrWhiteSpace(ID))
{
query = query.Where(x => x.PersonDetail.ID2 == ID2);
}
else
{
query = query.Where(x => x.PersonDetail.ID == ID);
}
var result = query.SingleOrDefault();
也有许多其他的方法来编写这个,但重要的部分是,您根本不需要涉及ID
检查与lambda。
这就是你想要的:
var query = Repository.GetQuery<Person>()
.Include(x => x.PersonDetail)
.SingleOrDefault(String.IsNullOrWhiteSpace(ID) ?
x => x.PersonDetail.ID2 == ID2 :
x => x.PersonDetail.ID == ID);
虽然不容易读,但它在一行代码中实现了您想要的功能。
编辑固定语法错误。