gpt4 book ai didi

c# - 具有泛型属性的 LINQ 表达式

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

我的问题与此有关:linq-expression-with-generic-class-properties

这次我想获得具有共同 id 的新创建的对象。 id 实际上是外键,因此可以有不同的名称。

我想到了以下内容:

public static IEnumerable<T> GetNew<TId, T>(IQueryable<T> objects, TId id, DateTime date, Expression<Func<T, TId>> idSelector) 
where T : class, ISyncable<TId>
{
return objects.Where(o => idSelector(o) == id && o.CreatedDate > date);
}

该方法将这样调用:

var modified = GetNew(dbObjects, id, date, entity => entity.PersonId);

不幸的是我得到了错误:

'idSelector' is a variable but is used like a method.

传递给方法的表达式应该做类似的事情:

objects.Where(o => o.PersonId == id && o.CreatedDate > date);

最佳答案

您需要构建一个表示条件的新表达式并将其传递给 Where:

public static IEnumerable<T> GetNew<TId, T>(IQueryable<T> objects, TId id, DateTime date, Expression<Func<T, TId>> idSelector)
where T : class, ISyncable<TId>
{
var paramExpr = Expression.Parameter(typeof(T));
var idEqExpr = Expression.Equal(Expression.Invoke(idSelector, paramExpr), Expression.Constant(id));
var createdPropExpr = Expression.Property(paramExpr, "CreatedDate");
var gtExpr = Expression.GreaterThan(createdPropExpr, Expression.Constant(date));
var andExpr = Expression.And(idEqExpr, gtExpr);

var condExpr = Expression.Lambda<Func<T, bool>>(andExpr, paramExpr);

return objects.Where(condExpr);
}

编辑:如果您知道 idSelector 是一个属性表达式,您可以提取引用的属性并创建一个新的属性表达式,而不是使用 Invoke:

var idProperty = (PropertyInfo)((MemberExpression)idSelector.Body).Member;
var idEqExpr = Expression.Equal(Expression.Property(paramExpr, idProperty), Expression.Constant(id));

关于c# - 具有泛型属性的 LINQ 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18933314/

25 4 0
文章推荐: javascript - 以不明确的格式返回的 C# JSON 字符串
文章推荐: javascript - 列表错误显示在控制台中,但只有一个错误显示在 div 中
文章推荐: javascript - 使用 jquery 为