gpt4 book ai didi

c# - 通过 navigation 属性动态 Where 过滤

转载 作者:行者123 更新时间:2023-11-30 20:29:24 26 4
gpt4 key购买 nike

我正在创建一个到目前为止效果很好的通用 Where 过滤器(只对 Contains 过滤器感兴趣):

private static MethodInfo contains = typeof(string).GetMethod("Contains");
private static Expression<Func<T, bool>> GetFilter<T>(string propertyName, string value)
{
var item = Expression.Parameter(typeof(T), "item");
var member = Expression.Property(item, propertyName);
var constant = Expression.Constant(value);
var body = Expression.Call(member, contains, constant);

return Expression.Lambda<Func<T, bool>>(body, item);
}

有什么方法可以扩展它以便我可以通过导航属性进行搜索吗?我对使用 Expression 还很陌生,所以我不确定该尝试什么。

一个例子是:

public class A
{
public int BId { get; set; }
public B B { get; set; }
}

public class B
{
public string Name { get; set; }
}

dbContext.As
.Where(GetFilter<A>("B.Name", "Hello World"))
.ToList();

但这在 Expression.Property("B.Name") 上失败了:

Instance property B.Name is not defined for type A

最佳答案

您需要为属性路径中的每个属性按顺序创建每个成员访问权限:

private static Expression<Func<T, bool>> GetFilter<T>(string propertyName, string value)
{
var item = Expression.Parameter(typeof(T), "item");

Expression member = item;
foreach (var prop in propertyName.Split('.'))
{
member = Expression.Property(member, prop);
}

var constant = Expression.Constant(value);
var body = Expression.Call(member, contains, constant);

return Expression.Lambda<Func<T, bool>>(body, item);
}

关于c# - 通过 navigation 属性动态 Where 过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46179841/

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