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

时间:2013-02-28 22:00:05

标签: c# linq lambda

我可能会尝试在这里做一些可能无法做到的事情。是否可以在我正在构建的表达式上的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)单独的查询来拉动相同的数据,并保持'决定逻辑'表达的外部?

感谢任何帮助,谢谢!

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);

虽然不易阅读,但它可以在单行中完成你想要的东西。

编辑修正了语法错误。