在C#中使用动态或表达式 [英] Using Dynamic Or Expressions in C#

查看:440
本文介绍了在C#中使用动态或表达式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  public static IQueryable< T> MyFilter< T>(此IQueryable< T>可查询)其中T:class,IModel 
{
var someIds = new int [] {1,2,3,4,5};
var userId = 2;

表达式< Func< T,bool>>> predicate1 = e => someIds.Contains(e.Id);
表达式< Func< T,bool>>> predicate2 = e => e.UserId ==用户id;
表达式< Func< T,bool>>>谓词3 = e => e.CreatedDate!= null;

var pred1 = Expression.Lambda< Func< T,bool>>(System.Linq.Expressions.Expression.Or(predicate1,predicate2));
var pred2 = Expression.Lambda< Func< T,bool>>(System.Linq.Expressions.Expression.Or(pred1,predicate3));


var result = queryable
.Where(pred2);

返回结果;
}

IModel 像这样:

 公共界面IModel {
int Id {get;组; }
int UserId {get;组; }
DateTime? CreatedDate {get;组; }
}

但是我收到这个错误:


二进制运算符或未定义为类型'System.Func 2 [AnyClass,System.Boolean]'和'System.Func 2 [AnyClass,System.Boolean]'。


在这一行:

  var pred1 = Expression.Lambda&FunC< T,bool>>(System.Linq.Expressions.Expression.Or(predicate1,predicate2)); 

如何解决这个问题?



预先感谢任何帮助

解决方案

您可以创建一个没有Expression.Or的谓词:

  public static IQueryable< T> MyFilter< T>(此IQueryable< T可查询)其中T:class,IModel 
{
var someIds = new int [] {1,2,3,4,5};
var userId = 2;

var result = queryable
.Where(e => someIds.Contains(e.Id)|| e.UserId == userId || e.CreatedDate!= null);

返回结果;
}


I use the dynamic filter in my program like following solution:

public static IQueryable<T> MyFilter<T>(this IQueryable<T> queryable) where T : class ,IModel
{
        var someIds = new int[]{1,2,3,4,5};
        var userId = 2;

        Expression<Func<T, bool>> predicate1 = e => someIds.Contains(e.Id);
        Expression<Func<T, bool>> predicate2 = e => e.UserId==userId;
        Expression<Func<T, bool>> predicate3 = e => e.CreatedDate != null;

        var pred1 = Expression.Lambda<Func<T, bool>>(System.Linq.Expressions.Expression.Or(predicate1, predicate2));
        var pred2 = Expression.Lambda<Func<T, bool>>(System.Linq.Expressions.Expression.Or(pred1, predicate3));


        var result = queryable
            .Where(pred2);

        return result;
    }

The IModel is like this:

Public interface IModel{
   int Id { get; set; }
   int UserId { get; set; }
   DateTime? CreatedDate { get; set; }
}

but, I get this error:

The binary operator Or is not defined for the types 'System.Func2[AnyClass,System.Boolean]' and 'System.Func2[AnyClass,System.Boolean]'.

at this line:

var pred1 = Expression.Lambda<Func<T, bool>>(System.Linq.Expressions.Expression.Or(predicate1, predicate2));

How can I solve this problem?

beforehand appreciate any help

解决方案

You can create one predicate without Expression.Or:

public static IQueryable<T> MyFilter<T>(this IQueryable<T> queryable) where T : class ,IModel
    {
        var someIds = new int[] { 1, 2, 3, 4, 5 };
        var userId = 2;

        var result = queryable
            .Where(e => someIds.Contains(e.Id) || e.UserId == userId || e.CreatedDate != null);

        return result;
    }

这篇关于在C#中使用动态或表达式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆