我可能会尝试在这里做一些可能无法做到的事情。是否可以在我正在构建的表达式上的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)单独的查询来拉动相同的数据,并保持'决定逻辑'表达的外部?
感谢任何帮助,谢谢!
答案 0 :(得分:6)
您的分支条件已知,因此您可以(并且应该)将分支拉出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();
还有很多其他方法可以写这个,但重要的是你根本不需要对lambda进行ID
检查。
答案 1 :(得分:2)
这就是你想要的:
var query = Repository.GetQuery<Person>()
.Include(x => x.PersonDetail)
.SingleOrDefault(String.IsNullOrWhiteSpace(ID) ?
x => x.PersonDetail.ID2 == ID2 :
x => x.PersonDetail.ID == ID);
虽然不易阅读,但它可以在单行中完成你想要的东西。
编辑修正了语法错误。