gpt4 book ai didi

c# - 使用匿名类型构建表达式

转载 作者:行者123 更新时间:2023-11-30 14:23:45 25 4
gpt4 key购买 nike

假设我通过 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 一起使用的方法,而且我也不熟悉任何其他可以让我动态构建这样的表达式的构造。如果不是,在为查询动态生成嵌套表达式时是否应该采用另一种方法?

最佳答案

假设您只需要 PredicateBuilder.False<T>PredicateBuilder.True<T>对于匿名类型,您可以这样做:

private static Expression<Func<T,bool>> MakeTrue<T>(IQueryable<T> ignored) {
return PredicateBuilder.True<T>();
}
private static Expression<Func<T,bool>> MakeFalse<T>(IQueryable<T> ignored) {
return PredicateBuilder.False<T>();
}

现在您可以重写代码而无需显式使用匿名类型:

var predicate = MakeFalse(query);
predicate = predicate.Or(v => v.ID > 10000);
query = query.Where(predicate);

这个想法是让编译器为你做类型推断。不幸的是,您最终得到了一个未使用的方法参数。

关于c# - 使用匿名类型构建表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44074696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com