0

注文番号または名前で検索したい状況があります。LINQ クエリに式を追加できることはわかっていWhereますが、検索しているプロパティに対してのみ式を追加したいと考えています。メソッドが呼び出されるまで、どのパラメーターが提供されるかわかりません。適切な条件を追加するにはどうすればよいですか?

public JsonResult Search(int orderNo=0, string firstName="", string lastName="")
{
    if (orderNo >0){
        //add Condition
    }

    if (firstName.Length > 0){
        //add Condition
    }

    if (lastName.Length > 0){
        //add Condition
    }

    //get Result

    var result = Repository.Orders.Where(???).OrderByDescending(e=> e.orderNo);

    //return
}
4

4 に答える 4

5

以下は、Repository.Orders が を返すことを前提としていますIQueryableが、アイデアは、必要な式を動的に追加することだけです。クエリの実行は deferredであるため、実際に結果を求める前に体系的に構築できます。

// You haven't executed the query yet, you can still build up what you need
var query = Repository.Orders;

if(orderNo >0){
    // You STILL haven't actually executed the query.
    query.Where(x => x.orderNo == orderNo);
}
if(firstName.Length > 0){
    query.Where(x => x.firstname == firstName);
}
if(lastName.Length > 0){
    query.Where(x => x.lastName == lastName);
}

// Even with this, you STILL aren't actually executing the query.
query.OrderByDescending(x => x.orderNo);

// You'll be executing and enumerating the results here, but that's OK because you've fully defined what you want.
return Json(query.ToArray(), JsonRequestBehavior.AllowGet);
于 2012-04-19T21:37:37.710 に答える
3

リポジトリが返されると仮定すると、次のIQueryableようにクエリを作成できます。

var query = Repository.Orders;
if(orderNo > 0)
{
    query = query.Where( x => x.OrderId == orderNo);
}

if(firstName.Length > 0)
{
   query = query.Where( x => x.FirstName == firstName);
}
//...
于 2012-04-19T21:37:17.570 に答える
1

これらの条件を AND する必要があり、リポジトリがIQueryableを返すと仮定する場合 (変更しないか、別のオーバーロードなどを追加しない場合)

var query = Repository.Orders

// Build where clause

if (orderNo >0){
    query = query.Where(o => o.OrderNo == orderNo);
}

if (firstName.Length > 0){
    query = query.Where(o => o.FirstName == firstName);
}

if (lastName.Length > 0){
    query = query.Where(o => o.LastName == lastName);
}

// Build OrderBy clause

query = query.OrderByDescending(o => o.orderNo);

// Execute Query

results = query.ToList();
于 2012-04-19T21:38:47.600 に答える
1
var result = Repository.Orders.Where(x => 
    (firstName == null || firstName.Trim() == "" || x.FirstName.Contains(firstName)) 
    && (lastName == null || lastName.Trim() == "") || x.LastName.Contains(lastName)) 
    && (orderNo == 0 || x.OrderNo == orderNo)).OrderByDescending(x => x.OrderNo)

@Amit_gの例も同様に機能し、間違いなく読みやすいです。1 つのクエリですべてを行うのが好きです。それは好みの問題です。

于 2012-04-19T21:37:46.043 に答える