2011-05-09 129 views
1

我是新來的實體框架。 我需要根據訂單和客戶開發Linq查詢。動態where子句實體框架3.5

爲例如:字符串的firstName可具有任何三個值

1)空 2)喬 3)如%喬%」

simailary我需要開發用於姓氏

我當前的查詢是這樣的

   using (NorthwindEntities ent = new NorthwindEntities()) 
       { 
        var UsersList = ent.User.Include("Orders"). 
           Include("OrderDetails"). 
           Include("OrderDetails.Products"). 
           .Where(o => (firstName== null || o.firstName== firstName||o.firstName.Contains(firstName)) 
&& (LastName== null || o.LastName== LastName ||o.LastName.contains(LastName)) 

    } 

我的查詢是否正確。有沒有其他更好的選擇來編寫linq實體查詢。

感謝

+0

如果您是Entity FrameWork的新手。不要使用EF 1.0,它附帶.net 3.5 SP1。有什麼問題。你使用下一代EF 4.0 – anishMarokey 2011-05-09 18:39:47

回答

2

您可以向Queryable對象添加條件。條件將建立直到執行數據查詢。

var UsersList = ent.User.Include("Orders") 
       .Include("OrderDetails") 
       .Include("OrderDetails.Products"); 

if (!string.IsNullOrEmpty(firstName)) 
    UsersList = UsersList.Where(o => o.firstName.Contains(firstName)); 

if (!string.IsNullOrEmpty(LastName)) 
    UsersList = UsersList.Where(o => o.LastName.Contains(LastName)); 
2

您可以在零件拆分查詢,它有點漂亮,那麼:

var UsersList = ent.User.Include("Orders") 
         .Include("OrderDetails") 
         .Include("OrderDetails.Products"); 

if(!string.IsNullOrEmpty(firstName)); 
    UsersList = UsersList.Where(o => o.firstName.Contains(firstName)); 

if(!string.IsNullOrEmpty(lastName)); 
    UsersList = UsersList.Where(o => o.lastName.Contains(lastName)) 

而且檢查o.firstName == firstName是多餘的,在Contains(firstName)部分就足夠了(同爲lastName的)。

+0

ok.so最好是使用條件進行分割。感謝 – user745607 2011-05-09 18:41:28

+0

是的,因爲你只是定義了查詢並且它還沒有執行,所以把它分成邏輯部分是有意義的。 – BrokenGlass 2011-05-09 18:43:01

0

你可以逐步建立你的查詢:

using (NorthwindEntities ent = new NorthwindEntities()) 
    { 
     var UsersList = ent.User.Include("Orders") 
       .Include("OrderDetails") 
       .Include("OrderDetails.Products"); 
     if (LastName != null) 
      UserList = UserList.Where(o => o.LastName == LastName || o.LastName.contains(LastName)); 

     if (FirstName != null) 
      UserList = UserList.Where(o => o.firstName== firstName||o.firstName.Contains(firstName); 

     // etc 
    } 

查詢將不會執行,直到你做一個ToList(),或在foreach或類似的東西使用它。