重用包含相同属性但不同lambda where子句条件的方法

jso*_*PPD 2 c# linq lambda entity-framework

这是示例场景,我有3种不同的方法,不同的参数,但结果是属性类的返回列表相同.

这是我的代码:

// My Model class:
public class Users{ 
   public string Name{ get; set; }
   public int Age { get; set; }
   public string Location { get; set; }
}

// My Vm class:
public class UserVm { 
   public string Name{ get; set; }
   public int Age { get; set; }
   public string Location { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是我的lambda查询

// by name
public IEnumerable<UserVm> GetUsersByName (string name){
      return db.Users.Where(x=>x.Name == name).Select(users=>new UserVm{
          Name = users.Name,
          Age = users.Age,
          Location = users.Location
      }).Tolist();
}

// by location
public IEnumerable<UserVm> GetUsersByAge (int age){
      return db.Users.Where(x=>x.Age == age).Select(users=>new UserVm{
          Name = users.Name,
          Age = users.Age,
          Location = users.Location
      }).Tolist();
}

// by age
public IEnumerable<UserVm> GetUsersByLocation (string location){
      return db.Users.Where(x=>x.Location== location).Select(users=>new UserVm{
          Name = users.Name,
          Age = users.Age,
          Location = users.Location
      }).Tolist();
}
Run Code Online (Sandbox Code Playgroud)

正如您所注意到的,它们都在视图模型中返回相同的结果.有没有像我可以重用那些冗余代码的方法?就像我会把这些代码

return db.Users.Where(x=>x.Location== location).Select(users=>new Users{
          Name = users.Name,
          Age = users.Age,
          Location = users.Location
      }).Tolist();
Run Code Online (Sandbox Code Playgroud)

在一个方法中,但是它们的where子句在调用main方法的每个方法中都不同?

Zoh*_*led 6

只需将lambda表达式传递给您的查询Func<Users, bool>:

public IEnumerable<UserVm> GetUsers(Func<Users, bool> predicate)
{
      return db.Users.Where(predicate).Select(users=>new UserVm
      {
          Name = users.Name,
          Age = users.Age,
          Location = users.Location
      });
}
Run Code Online (Sandbox Code Playgroud)

另请注意,我已经ToList()从原始代码中删除了,因为您还是要返回IEnumerable.

你这样使用它:

// To get all users under a specific age
var usersVm = GetUsers(u => u.Age < age);

// To get all users with a specific name
var usersVm = GetUsers(u => u.name == name);
Run Code Online (Sandbox Code Playgroud)

顺便说一句:我喜欢在ViewModel类中有一个构造函数,它是一个Model类的实例,所以我可能会这样写:

public class UserVm { 
   public UserVm (Users model)
   {
       Name = model.Name;
       Age = model.Age;
       Location = model.Location;
   }
   public string Name{ get; set; }
   public int Age { get; set; }
   public string Location { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后你的GetUsers方法看起来像这样:

public IEnumerable<UserVm> GetUsers(Func<Users, bool> predicate)
{
      return db.Users.Where(predicate).Select(user => 
          new UserVm(user));
}
Run Code Online (Sandbox Code Playgroud)