【问题标题】:How to realize System.Linq.Expressions.Expression.Like如何实现 System.Linq.Expressions.Expression.Like
【发布时间】:2012-04-24 23:15:28
【问题描述】:

我正在写一个动态的linq查询来实现分页,现在遇到一个问题,我需要System.Linq.Expressions.Expression.Like函数,但是System.Linq.Expressions.Expression中不存在,这是我的代码。

Expression mWhereFunc;          // Filter clause 
ParameterExpression mLinqParam; // Linq param

// Get current request page
string mCurPage = this.Request.QueryString["page"];
if (String.IsNullOrEmpty(mCurPage))
{
    mCurPage = "1";
}

mLinqParam = Expression.Parameter(typeof(ORD_Order), "p");
mWhereFunc = Expression.Equal(Expression.Property(mLinqParam,
     typeof(ORD_Order).GetProperty("ItemIsValid")), 
     Expression.Constant(true));

string mOrderSN = this.Request.QueryString["txtOrderSN"];
if (!String.IsNullOrEmpty(mOrderSN))
{
    mWhereFunc = Expression.And(mWhereFunc, 
     **Expression.Equal**(Expression.Property(mLinqParam,
     typeof(ORD_Order).GetProperty("OrderSN")), 
     Expression.Constant(mOrderSN)));
}

var mLambdaWhere = (Expression<Func<ORD_Order, 
      bool>>)Expression.Lambda<Func<ORD_Order, bool>>(mWhereFunc, 
     new ParameterExpression[] { mLinqParam });
Func<ORD_Order, Int32> mLambdaOrder = p => p.OrderID;

IORD_OrderRepository rptOrder = new ORD_OrderRepository();
ICTM_CustomerRepository rptCtm = new CTM_CustomerRepository();

var list = from o in rptOrder.GetAll()
             .Where(mLambdaWhere)
                 .OrderBy(mLambdaOrder)
                 .Skip((int.Parse(mCurPage) - 1) * mPageSize).Take(mPageSize)
               join c in rptCtm.GetAll()
               on o.CustomerID equals c.CustomerID
               select new
               {
                   o.OrderID,
                   o.OrderSN,
                   o.CustomerID,
                   c.ContactName,
                   o.Status,
                   o.CreateDate,
                   o.Description
               };

Expression.Equal 是我想将其更改为 Expression.Like 的地方

任何帮助将不胜感激。

【问题讨论】:

    标签: c# asp.net .net linq lambda


    【解决方案1】:

    我这样修改了我的代码

    mWhereFunc = Expression.And(mWhereFunc, Expression.Call(
       Expression.Property(mLinqParam, typeof(ORD_Order).GetProperty("OrderSN")), 
       typeof(String).GetMethod("Contains"), 
       new Expression[] { Expression.Constant(mOrderSN) }));
    

    它成功了,非常感谢你们所有人。

    【讨论】:

    • 谢谢史蒂文!您的简短回答大大提高了我的知识!
    【解决方案2】:

    linq 的等价物是 String.ContainsString.StartsWith 等。http://www.simonrhart.com/2008/06/using-like-in-linq-to-sql-under-c.html

    【讨论】:

      【解决方案3】:

      如果你使用 NHibernate,你可以创建一个 Like 方法并使用 Expression 来调用它

      您可以在此处查看有关如何进行“赞”扩展的帖子:NHibernate Linq Provider Extension

      然后你像这样构建“喜欢”表达式:

      Expression.Call(typeof(MyLinqExtensions).GetMethod("IsLike"), Expression.Property(mLinqParam,
           typeof(ORD_Order).GetProperty("OrderSN")), 
           Expression.Constant(mOrderSN)));
      

      编辑:作为附加注释,您应该使用 Expression.AndAlso 而不是 Expression.And,因为第一个是 && 运算符,最后一个是 & 运算符

      编辑 2: 对于 Entity Framework,请查看这篇文章(Linq To Entities 场景):SQL User-Defined Functions in Entity Framework 4,我没有这方面的经验,但它似乎与 NH 提供者相同,之后这样做了构建 Linq 表达式应该和我之前发布的一样

      【讨论】:

      • 我用的是实体框架4,有没有办法解决这个问题?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-24
      • 2014-09-06
      • 2013-12-16
      • 2011-02-17
      • 2015-01-03
      • 2015-06-09
      相关资源
      最近更新 更多