2012-04-19 53 views
0

我有一種情況,可能需要按訂單號或名稱進行搜索。我知道我可以在我的LINQ查詢中添加Where表達式,但我只想將它添加到我正在搜索的屬性中!我將不知道,直到方法被調用哪個參數將被提供,所以我怎麼能添加適當的條件?如果我不確定哪些屬性需要匹配,如何將Where表達式添加到LINQ查詢中?

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 
} 
+0

試過[表達式樹(http://msdn.microsoft.com /en-us/library/bb882637.aspx)? – 2012-04-19 21:33:21

回答

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); 
} 
//... 
5

以下假定Repository.Orders正在恢復的IQueryable,但這個想法僅僅是動態添加表情你需要。 execution of the query is deferred,所以你可以在實際詢問結果之前系統地構建它。

​​
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

如果你有這些條件,假設你的倉庫返回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(); 
相關問題