为简单起见,假设我有以下两个类:
public class ComplexClass
{
public List<SubClass> SubClasses { get; set; }
public string Name { get; set; }
}
public class SubClass
{
public string Name { get; set; }
}
我有一个List<ComplexClass>
,我需要根据一些参数构建一个查询。
如果我需要做的只是使用Name
. ComplexClass
这是一个例子:
static IQueryable<ComplexClass> GetQuery(string someParameter, string someOtherParameter)
{
var query = list.AsQueryable();
if (!String.IsNullOrEmpty(someParameter))
query = query.Where(c => c.Name.StartsWith(someParameter));
if (!String.IsNullOrEmpty(someOtherParameter))
query = query.Where(c => c.Name.EndsWith(someOtherParameter));
return query;
}
根据我拥有的参数,我可以添加更多查询元素。当然上面的例子很简单,但是实际的问题包含更多的参数,而且这个数量可以增长。
如果我想找到那些ComplexClass
实例SubClass
符合基于参数的标准的实例,事情就没有那么简单了:
static IQueryable<ComplexClass> GetSubQuery(string someParameter, string someOtherParameter)
{
var query = list.AsQueryable();
if (!String.IsNullOrEmpty(someParameter))
if (!String.IsNullOrEmpty(someOtherParameter))
return query.Where(c => c.SubClasses.Where(sc => sc.Name.StartsWith(someParameter) && sc.Name.EndsWith(someOtherParameter)).Any());
else
return query.Where(c => c.SubClasses.Where(sc => sc.Name.StartsWith(someParameter)).Any());
else
if (!String.IsNullOrEmpty(someOtherParameter))
return query.Where(c => c.SubClasses.Where(sc => sc.Name.EndsWith(someOtherParameter)).Any());
else
return null;
}
我不能再根据每个参数添加查询的位,我现在需要一次编写整个查询,这意味着我需要检查每个参数组合,这并不理想。
我怀疑关键是构建一个Expression
类并从中创建一个 lambda 表达式,但我不确定如何解决这个问题。
有什么建议么?:)
编辑:
我最初的想法是这样的:
static IQueryable<ComplexClass> GetSubQuery(string someParameter, string someOtherParameter)
{
var query = list.AsQueryable();
query = query.Where(c =>
{
var subQuery = c.SubClasses.AsQueryable();
if (!String.IsNullOrEmpty(someParameter))
subQuery = subQuery.Where(sc => sc.Name.StartsWith(someParameter));
if (!String.IsNullOrEmpty(someOtherParameter))
subQuery = subQuery.Where(sc => sc.Name.EndsWith(someOtherParameter));
return subQuery.Any();
});
return query;
}
这适用于我的小型控制台测试应用程序,因为它使用 LINQ to Objects。不幸的是,我需要使用 Entity Framework 和 LINQ to Entities,这会导致类似于上面的实现抛出A lambda expression with a statement body cannot be converted to an expression tree
错误消息。