gpt4 book ai didi

c# - 如何构建与通用对象进行比较的 Linq 表达式树?

转载 作者:行者123 更新时间:2023-11-30 15:50:47 26 4
gpt4 key购买 nike

我有一个 IQueryable 和一个 T 类型的对象。

我想做 IQueryable().Where(o => o.GetProperty(fieldName) == objectOfTypeT.GetProperty(fieldName))

所以...

public IQueryable<T> DoWork<T>(string fieldName)
where T : EntityObject
{
...
T objectOfTypeT = ...;
....
return SomeIQueryable<T>().Where(o => o.GetProperty(fieldName) == objectOfTypeT.GetProperty(fieldName));
}

仅供引用,GetProperty 不是有效函数。我需要执行此功能的东西。

我是在周五下午头脑发热还是这是一件复杂的事情?


objectOfTypeT 我可以执行以下操作......

var matchToValue = Expression.Lambda(ParameterExpression
.Property(ParameterExpression.Constant(item), "CustomerKey"))
.Compile().DynamicInvoke();

效果很好,现在我只需要第二部分:

返回 SomeIQueryable().Where(o => o.GetProperty(fieldName) == matchValue);

最佳答案

像这样:

    var param = Expression.Parameter(typeof(T), "o");
var fixedItem = Expression.Constant(objectOfTypeT, typeof(T));
var body = Expression.Equal(
Expression.PropertyOrField(param, fieldName),
Expression.PropertyOrField(fixedItem, fieldName));
var lambda = Expression.Lambda<Func<T,bool>>(body,param);
return source.Where(lambda);

我已经开设了一个博客,其中将涵盖一些表达主题,here .

如果遇到任何问题,另一种选择是先从 objectOfTypeT 中提取值(使用反射),然后在 Expression.Constant 中使用该值,但我怀疑它“照原样”会很好。

关于c# - 如何构建与通用对象进行比较的 Linq 表达式树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/232171/

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