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方法的每个方法中都不同?
只需将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)
| 归档时间: |
|
| 查看次数: |
87 次 |
| 最近记录: |