C# 动态where子句实体框架3.5

C# 动态where子句实体框架3.5,c#,linq,entity,C#,Linq,Entity,我不熟悉实体框架。 我需要开发一个基于订单和客户的Linq查询 例如:stringfirstname可以有三个值中的任意一个 1) 空的 2) 乔 3) 像%Joe%' simailary我需要为lastname开发 我当前的查询是这样的 using (NorthwindEntities ent = new NorthwindEntities()) { var UsersList = ent.

我不熟悉实体框架。 我需要开发一个基于订单和客户的Linq查询

例如:stringfirstname可以有三个值中的任意一个

1) 空的 2) 乔 3) 像%Joe%'

simailary我需要为lastname开发

我当前的查询是这样的

                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实体查询的任何其他更好的选项


谢谢

您可以将查询拆分为多个部分,这样会更好:

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
是多余的,
包含(firstName)
部分就足够了(与lastName相同)。

您可以将查询拆分为多个部分,这样会更好:

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
是多余的,而
包含(firstName)
部分就足够了(与lastName相同)。

您可以分步骤建立查询:

    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
或类似操作中使用它时,查询才会执行。

您可以分步骤建立查询:

    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
或类似操作中使用它时,查询才会执行。

您可以向可查询对象添加条件。在执行数据查询之前,这些条件将不断累积

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));

可以向可查询对象添加条件。在执行数据查询之前,这些条件将不断累积

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));

如果您是实体框架的新手。不要使用.NET3.5SP1附带的EF1.0。有一些问题。如果您是实体框架新手,请使用下一代EF 4.0。不要使用.NET3.5SP1附带的EF1.0。有一些问题。您可以使用下一代EF 4.0。是的,因为您只定义了查询,而查询尚未执行,所以将其拆分为逻辑部分是有意义的。是的,因为您只定义了查询,而查询尚未执行,所以将查询拆分为逻辑部分是有意义的。