0

我可能正在尝试在这里做一些不可能的事情。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)提取相同数据的单独查询,并将“决定逻辑”保留在外部表达?

任何帮助表示赞赏,谢谢!

4

2 回答 2

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

还有很多其他的写法,但重要的是你根本不需要ID用 lambda 进行检查。

于 2013-02-28T22:07:28.093 回答
2

这就是你想要的:

var query = Repository.GetQuery<Person>()
                  .Include(x => x.PersonDetail)
                  .SingleOrDefault(String.IsNullOrWhiteSpace(ID) ?
                          x => x.PersonDetail.ID2 == ID2 :
                          x => x.PersonDetail.ID == ID);

尽管不容易阅读,但它可以在单行中完成您想要的。

编辑修正语法错误。

于 2013-02-28T22:09:30.450 回答