gpt4 book ai didi

entity-framework - 如何在 Entity Framework 中动态构建 Where 表达式?

转载 作者:行者123 更新时间:2023-12-04 11:48:58 25 4
gpt4 key购买 nike

我看过this answer关于如何在 Entity Framework 中动态创建 OrderBy 表达式。但我还想构建一个动态的 Where 表达式。类似的东西:

public IEnumerable<InventoryItem> GetAll(string filterBy, object value)
{
var results = new List<InventoryItem>();
using (var db = new InventoryDb())
{
if (QueryHelper.PropertyExists<InventoryItem>(filterBy))
{
var query = db.rri_InventoryItems.WhereByProperty(filterBy, value);

foreach(var item in query.Where(expr))
{
results.Add(ConvertItem(item));
}
}
}
return results;
}

传入要过滤的属性和作为 ab 对象的值。 Queryable 有两种方法 Where 都采用两个参数,所以我什至不确定哪个是正确的。

在这一点上,我更加迷失了。我不知道如何重构原来的 OrderByProerty 提供 的方法WhereByProperty .我知道我在这里所拥有的是完全错误的。我不知道该怎么办。

理想情况下,我希望通过提供可用于构建查询的对象集合来进一步扩展 运营商。

最佳答案

Queryable has two methods for Where that both take two parameters, so I am not even sure which is the proper one.



您需要收到 Expression<Func<T, bool>> predicate 的那个.

以下是如何动态构建类似于 (T item) => item.Property == value 的谓词:
public static partial class QueryableExtensions
{
public static IQueryable<T> WhereEquals<T>(this IQueryable<T> source, string member, object value)
{
var item = Expression.Parameter(typeof(T), "item");
var memberValue = member.Split('.').Aggregate((Expression)item, Expression.PropertyOrField);
var memberType = memberValue.Type;
if (value != null && value.GetType() != memberType)
value = Convert.ChangeType(value, memberType);
var condition = Expression.Equal(memberValue, Expression.Constant(value, memberType));
var predicate = Expression.Lambda<Func<T, bool>>(condition, item);
return source.Where(predicate);
}
}

我试图以这种方式编写它,以便您可以跳过代码以了解它的作用。可能需要解释的唯一一行是:
var memberValue = member.Split('.').Aggregate((Expression)item, Expression.PropertyOrField);

这是一种处理嵌套属性的简单方法,例如 obj.Prop1.Prop2等。如果您不需要这样的功能,您可以简单地使用它:
var memberValue = Expression.PropertyOrField(item, member);

关于entity-framework - 如何在 Entity Framework 中动态构建 Where 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39182903/

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