【问题标题】:dynamic where clause entity framework 3.5动态where子句实体框架3.5
【发布时间】:2011-05-09 18:35:36
【问题描述】:

我是实体框架的新手。 我需要开发一个基于订单和客户的 Linq 查询。

例如:字符串 firstName 可以是三个值中的任何一个

1) 空 2) 乔 3) 喜欢 %Joe%'

我需要为姓氏开发的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 实体查询还有其他更好的选择吗?

谢谢

【问题讨论】:

  • 如果您不熟悉 Entity FrameWork。不要使用 .net 3.5 SP1 附带的 EF 1.0。这有一些问题。您拥有下一代 EF 4.0

标签: c# linq entity


【解决方案1】:

您可以向 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 相同)。

    【讨论】:

    • 是的,因为您只是在定义查询并且它还没有执行,所以将它分成逻辑部分是有意义的。
    【解决方案3】:

    您可以按步骤构建查询:

        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 或类似的东西中使用它之前,查询不会执行。

    【讨论】:

      猜你喜欢
      • 2010-10-06
      • 2011-12-31
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      相关资源
      最近更新 更多