2011-05-09 128 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或类似的东西使用它。