加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 01:57:20 所属栏目:百科 来源:网络整理
导读:我的问题与这个问题有关: linq-expression-with-generic-class-properties 这次我想得到新创建的具有共同id的对象. id实际上是外键,因此可以有不同的名称. 我想出了以下内容: public static IEnumerableT GetNewTId,T(IQueryableT objects,TId id,DateTime
我的问题与这个问题有关: 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,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));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读