如何在Enumerable方法中添加条件语句

本文关键字:添加 条件 语句 方法 Enumerable | 更新日期: 2023-09-27 18:01:42

我可能试图在这里做一些可能不可能的事情。是否有可能在我正在构建的表达式上注入一些逻辑到SingleOrDefault枚举方法中?

问题是,除了用于提取结果的参数之外,我将有(2)个相同的查询结果。

表示IDID2值并非在所有条件下都存在。我试图创建一个单一的表达式,将缩小基于条件的结果。以下是我试图完成的事情:

//'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)单独的查询,提取相同的数据,并保持"决定逻辑"外部的表达式?

任何帮助都是感激的,谢谢!

如何在Enumerable方法中添加条件语句

分支条件已知,因此可以(并且应该)将分支从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);

虽然不容易读,但它在一行代码中实现了您想要的功能。

编辑固定语法错误。