Linq statement Where within a Where



我正在构建一个查询工具,供非技术人员从数据库中检索记录。

我有一个带有各种下拉列表的表单,用户可以根据自己想要的内容进行选择。

我遇到了一个问题,我的查询返回的记录与用户选择不匹配。

我相信只有在查询联接的表时才会发生这种情况。

我有以下内容:

results = results.Where(c => c.CustomerEnrollment
                  .Where(x => x.CustomerCategoryID == CustomerCategoryID)
                  .Any());
results = results.Where(c => c.CustomerEnrollment
              .Where(x => x.StartDate <= DateRangeStart && x.EndDate >= DateRangeStart)
              .Any());

这将返回正确类别的结果,但不在指定的日期范围内。

我也试过:

results = results.Where(c => c.CustomerEnrollment
                          .Any(x => x.CustomerCategoryID == CustomerCategoryID));

尝试将日期范围检查更改为;

更改:

x => x.StartDate <= DateRangeStart && x.EndDate >= DateRangeStart

收件人:

//StartDate should be greater than or equal to
//EndDate should be less than or equal to
//Also you are using same variable DateRangeStart to check start and end
x => x.StartDate >= DateRangeStart && x.EndDate <= DateRangeEnd

您的查询返回的类别中,任何CustomerEnrollment都有其Id,并且任何CustomerEnrollment都在所需的数据范围内,但这些CustomerEnrollment s不一定相同

为了确保CustomerEnrollment满足这两个条件,您必须执行以下操作:

results = results.Where(c => c.CustomerEnrollment
                  .Where(x => x.CustomerCategoryID == CustomerCategoryID
                           && x.StartDate <= DateRangeStart
                           && x.EndDate >= DateRangeStart)
                  .Any());

使用PredicateBuilder,您可以参数化条件:

using LinqKit;
...
var pred = Predicate.True<CustomerEnrollment>();
if (CustomerCategoryID > 0)
    pred = pred.And(c => c.CustomerCategoryID == CustomerCategoryID);
if (DateRangeStart.HasValue)
    pred = pred.And(c => c.StartDate <= DateRangeStart
                      && c.EndDate >= DateRangeStart);
results = results.AsExpandable()
                 .Where(c => c.CustomerEnrollment.AsQueryable()
                     .Any(pred));

.AsExpandable().AsQueryable()的组合似乎是避免异常的唯一方法。

最新更新