我正在编写一个动态linq查询来实现分页,我现在面临一个问题,我需要System.Linq.Expressions.Expression.Like
函数,但System.Linq.Expressions.Expression
中不存在,这是我的代码。< / p>
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的地方
任何帮助将不胜感激。
答案 0 :(得分:2)
我修改了我的代码
mWhereFunc = Expression.And(mWhereFunc, Expression.Call(
Expression.Property(mLinqParam, typeof(ORD_Order).GetProperty("OrderSN")),
typeof(String).GetMethod("Contains"),
new Expression[] { Expression.Constant(mOrderSN) }));
它很有效,非常感谢你们所有人。
答案 1 :(得分:1)
与linq的等效内容类似String.Contains
,String.StartsWith
等。http://www.simonrhart.com/2008/06/using-like-in-linq-to-sql-under-c.html
答案 2 :(得分:0)
如果您正在使用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
,因为第一个是&amp;&amp;操作员和最后一个是&amp;操作
编辑2:对于实体框架,请查看此帖子(Linq To Entities场景):SQL User-Defined Functions in Entity Framework 4,我没有使用它的经验,但它似乎与NH提供商相同,然后构建Linq表达式应该与我之前发布的相同