gpt4 book ai didi

c# - 如何获得 Expression.Lambda> 泛型

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

我有以下代码,我想用通用类型替换 Department 类型...

我想替换...

Expression.Lambda<Func<Department, bool>>(body, param)

由..

 Expression.Lambda<Func<T, bool>>(body, param)

我知道我必须使用反射,但我只有一个装箱为对象的域模型类。

我可以获得对象及其类型名称,但我很难用泛型类型替换硬编码类型 Department。

我无法转换方法 ExistsExists<T>因为我不知道什么<T>是在调用方法时。我只有对象。

public bool Exists(object id, object source, Type type)
{
var param = Expression.Parameter(type, "e");
var body = Expression.Equal(Expression.Property(param, "Id", Expression.Constant(id));
var where = Expression.Lambda<Func<Department, bool>>(body, param);

var context = new DataContext();

var dbSet = context.Set<Department>();

return dbSet.AsNoTracking().Any(where);
}

对于 dbset 案例,我尝试了以下代码

public static IQueryable<object> Set (this DbContext context, Type type)
{
return IQueryable<object>)context.GetType().GetMethod("Set")?.MakeGenericMethod(type).Invoke(context, null);
}

并替换...

var dbSet = context.Set<Department>();

var dbSet = context.Set(type);

它似乎有效,我得到了正确的 dbset,但 where 子句存在一些问题,会导致一些运行时错误。

我想要实现的是避免 EF Core 进行客户端评估。 IE。

Any(e => e.ToString == id.ToString())

这会起作用,但会执行不良的客户端评估。

最佳答案

I can't convert method Exists to Exists<T> because I don't know what <T> is at the time of calling the method. I only have the object.

这就是泛型有助于生成动态 lambda 表达式的地方。

public class MyEntity
{
public int Id { get; set; }
}

public class muckingabout
{
public bool Exists<T>(T myentity) where T: MyEntity
{
var type = typeof(T);
//e =>
var param = Expression.Parameter(type, "e");
//e => e.Id
var property = Expression.Property(param, "Id");
var value = Expression.Constant(myentity.Id);
//e => e.Id == myentity.Id
var body = Expression.Equal(property, value);
var lambda = Expression.Lambda<Func<T, bool>>(body, param);

using (var context = new DbContext())
{
var dbSet = context.Set<T>();
return dbSet.AsNoTracking().Any(lambda);
}
}
}

关于c# - 如何获得 Expression.Lambda<Func<T, bool>> 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52711295/

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