gpt4 book ai didi

c# - 不使用 PredicateBuilder 向表达式动态添加谓词

转载 作者:行者123 更新时间:2023-11-30 22:58:03 24 4
gpt4 key购买 nike

我使用 linqToEntities并想添加 OR动态条件。

我知道there is a great library PredicateBuilder by brother Albahari它可以解决我的任务,但我不能使用它。

我的条件是这样的:

IEnumerable<Condition> conditions = new List<Condition>()
{
new Condition(){IdReference = 1, TableName = "Table1" },
new Condition(){IdReference = 2, TableName = "Table2" },
new Condition(){IdReference = 3, TableName = "Table3" },
// and so on
};

我有的是:

var histories = db.History as IQueryable<History>;
foreach (var cond in conditions)
{
//What code should be here to be translated into:
/*
histories = histories
.Where(h => h.IdReference == 1 && h.TableName =="Table1"
|| h.IdReference == 2 && h.TableName == "Table2"
|| h.IdReference == 3 && h.TableName == "Table3");
// and so on
*/
}

但是,我事先不知道有多少conditions将会。怎么可能添加 OR动态条件来自 IEnumerable<Condition>

最佳答案

不确定使用 predicate builder 有什么问题 - 它不一定是 LINQ Kit 包,所谓的 predicate builder 通常是一个带有 2 个扩展方法的静态类 - 比如 Universal Predicate Builder或者我自己的 PredicateUtils 来自 Establish a link between two lists in linq to entities where clause和类似的。

无论如何,一旦你想要它,当然可以使用普通的 Expression 来构建它。类静态方法。

添加以下内容以消除在每次调用之前编写 Expression. 的需要:

using static System.Linq.Expressions.Expression;

然后使用这样的东西:

if (conditions.Any())
{
var parameter = Parameter(typeof(History));
var body = conditions
.Select(condition => Expression.Constant(condition))
.Select(condition => Expression.AndAlso(
Expression.Equal(
Expression.PropertyOrField(parameter, nameof(History.IdReference)),
Expression.Convert(
Expression.PropertyOrField(condition, nameof(Condition.IdReference))
, Expression.PropertyOrField(parameter, nameof(History.IdReference)).Type)
),
Expression.Equal(
Expression.PropertyOrField(parameter, nameof(History.TableName)),
Expression.Convert(
Expression.PropertyOrField(condition, nameof(Condition.TableName))
, Expression.PropertyOrField(parameter, nameof(History.TableName)).Type)
)
))
.Aggregate(Expression.OrElse);
var predicate = Lambda<Func<History, bool>>(body, parameter);
histories = histories.Where(predicate);
}

关于c# - 不使用 PredicateBuilder 向表达式动态添加谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53248938/

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