Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何实现System.Linq.Expressions.Expression.Like_C#_Asp.net_.net_Linq_Lambda - Fatal编程技术网

C# 如何实现System.Linq.Expressions.Expression.Like

C# 如何实现System.Linq.Expressions.Expression.Like,c#,asp.net,.net,linq,lambda,C#,Asp.net,.net,Linq,Lambda,我正在编写一个动态linq查询来实现分页,现在我面临一个问题,我需要System.linq.Expressions.Expression.Like函数,但它在System.linq.Expressions.Expression中不存在,这是我的代码 Expression mWhereFunc; // Filter clause ParameterExpression mLinqParam; // Linq param // Get current request page

我正在编写一个动态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
               };
表达式mWhereFunc;//过滤子句
参数表达式mLinqParam;//林克参数
//获取当前请求页面
字符串mCurPage=this.Request.QueryString[“page”];
if(String.IsNullOrEmpty(mCurPage))
{
mCurPage=“1”;
}
mLinqParam=表达式参数(类型(ORD_顺序),“p”);
mWhereFunc=Expression.Equal(Expression.Property(mLinqParam,
typeof(Order_Order).GetProperty(“ItemIsValid”),
表达式。常数(真));
string mOrderSN=this.Request.QueryString[“txtOrderSN”];
如果(!String.IsNullOrEmpty(mOrderSN))
{
mWhereFunc=表达式和(mWhereFunc,
**Expression.Equal**(Expression.Property(mLinqParam,
类型(Order_Order).GetProperty(“OrderSN”),
表达式常数(mOrderSN));
}
var mLambdaWhere=(表达式)Expression.Lambda(mWhereFunc,
新参数表达式[]{mLinqParam});
Func mLambdaOrder=p=>p.OrderID;
IORD_OrderRepository rptOrder=新ORD_OrderRepository();
ICTM_CustomerRepository rptCtm=新CTM_CustomerRepository();
var list=从rptOrder.GetAll()中的o开始
.何处(此处)
.OrderBy(mLambdaOrder)
.Skip((int.Parse(mCurPage)-1)*mPageSize.Take(mPageSize)
在rptCtm.GetAll()中加入c
关于o.CustomerID等于c.CustomerID
选择新的
{
o、 医嘱ID,
o、 订单号,
o、 客户ID,
c、 联系人姓名,
o、 地位,
o、 CreateDate,
o、 描述
};
表达式。Equal是我想将其更改为表达式的地方。例如


任何帮助都将不胜感激。

如果您使用的是NHibernate,您可以创建一个类似的方法,并使用表达式调用该方法

你可以在这里查看关于如何进行“喜欢”扩展的帖子:

然后构建“Like”表达式,如下所示:

Expression.Call(typeof(MyLinqExtensions).GetMethod("IsLike"), Expression.Property(mLinqParam,
     typeof(ORD_Order).GetProperty("OrderSN")), 
     Expression.Constant(mOrderSN)));
EDIT:作为附加注释,您应该使用
Expression.AndAlso
而不是
Expression.And
,因为第一个是&运算符,最后一个是&运算符


编辑2:对于实体框架,请检查此帖子(Linq到实体场景):,我没有使用它的经验,但它似乎与NH提供者相同,在这样做之后,构建Linq表达式应该与我之前发布的相同

类似于Linq的等价物是
字符串。包含
String.StartsWith

我这样修改了我的代码

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

非常感谢大家,它可以正常工作。

我正在使用entity framework 4,有什么方法可以解决这个问题吗?谢谢Steven!你简短的回答大大提高了我的知识!