【发布时间】:2017-05-19 16:19:31
【问题描述】:
假设我通过 LINQ 查询创建了一些匿名类型:
var query = from Person in db.People
join Pet in Pets on Person.ID equals Pet.PersonID
join Thingy in Thingies on Person.ID equals Thingy.PersonID
select new {
Person.ID,
PetName = Pet.Name,
Thing = Thingy.Thing,
OtherThing = Thingy.OtherThing
};
现在我想通过动态构建谓词将一些复杂的表达式应用于查询。我一直在为已知类型做的事情是这样的:
var predicate = PredicateBuilder.False<MyType>();
predicate = predicate.Or(myType => myType.Flag);
if (someCondition) {
var subPredicate = PredicateBuilder.True<MyType>();
subPredicate = subPredicate.And(myType => myType.Thing == someThing);
subPredicate = subPredicate.And(myType => myType.OtherThing == someOtherThing);
predicate = predicate.Or(subPredicate);
}
query = query.Where(predicate);
是否可以用匿名类型做类似的事情?我还没有找到一种将匿名类型与PredicateBuilder 一起使用的方法,而且我不熟悉任何其他可以让我动态构建这样的表达式的构造。如果没有,在为查询动态生成嵌套表达式时我应该采取另一种方法吗?
【问题讨论】:
-
我不确定在这种情况下您将如何应用您的谓词;匿名类型只有
ID和PetName-Thing和OtherThing是什么? -
@MarcGravell 抱歉,这只是一些示例代码。属性并不重要。只是我有一个匿名类型,我想与
PredicateBuilder一起使用。真实案例涉及将一些属性与一些过滤器预设进行比较,并从数据库中提取额外数据以进一步限制结果。我编辑了原始查询以生成示例的所有正确属性。 -
我建议升级到不再需要
.True或.False的最新 LINQKit。它在 GitHub 上。
标签: c# linq linq-to-sql predicatebuilder