1

ページングを実現するために動的な 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 に変更したい場所です ここに画像の説明を入力

どんな助けでも大歓迎です。

4

3 に答える 3

2

このようにコードを変更しました

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

そしてそれはうまくいきます。皆さんに感謝します。

于 2012-04-15T12:12:44.787 に答える
1

linq の同等物はString.ContainsなどですString.StartsWithhttp://www.simonrhart.com/2008/06/using-like-in-linq-to-sql-under-c.html

于 2012-04-13T14:36:57.803 に答える
0

NHibernate を使用している場合は、Like メソッドを作成し、Expression を使用してそれを呼び出すことができます

ここで「いいね」拡張機能を実行する方法について、この投稿を確認できます: NHibernate Linq Provider Extension

そして、次のように「Like」式を作成します。

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

編集:追加のコメントとして、最初のものは && 演算子であり、最後のものは & 演算子であるため、Expression.AndAlso代わりに使用する必要がありますExpression.And

EDIT 2: Entity Framework については、この投稿を確認してください (Linq To Entities シナリオ): SQL User-Defined Functions in Entity Framework 4、経験はありませんが、NH プロバイダーと同じようです。それを行った後、Linq 式を構築します。前に投稿したものと同じはずです

于 2012-04-12T15:30:12.533 に答える