Entity Framework Linq 将 lambda 表达式嵌入到可重用函数中
Entity Framework Linq embed lambda expressions into a reusable function
使用 Linq 和 Entity Framework 查询数据库时,有没有办法减少重复的 lambda?例如:
db.Users.FirstOrDefault(x => x.Username == "MM001" && x.Type == 1 && x.IsActive == True && x.ExpiryDate > DateTime.Now);
我想把它变成:
db.Users.FirstOrDefault(x => x.Username == "MM001" && x.IsActiveStaff());
我尝试将如下方法写入我的用户 POCO:
public bool IsActiveStaff()
{
return Type == 1 && IsActive == True && ExpiryDate > DateTime.Now;
}
但是,我收到以下错误:LINQ to Entities 无法识别方法 'Boolean IsActiveStaff()' 方法,并且无法将此方法转换为存储表达式。
我意识到这是因为 LINQ To Entities 无法将此方法转换为 SQL 表达式,但有什么方法可以让它工作吗?
我知道我可以写一个查询命令class,它只需要一个用户名作为参数,然后把我所有的逻辑都放在那里,但我想知道你是否可以嵌入一个系列将 lambdas 转化为方法或扩展方法等,并在需要时使用它们,就像我上面的例子一样。
创建适当类型的表达式:
Expression<Func<User, bool>> IsActiveStaff = x => x.Type == 1 && x.IsActive && x.ExpiryDate > DateTime.Now;
然后:
db.Users.Where(IsActiveStaff).FirstOrDefault(x => x.Username == "MM001");
我更喜欢使用如下扩展方法:
public static class UsersExtensions
{
public static IQueryable<User> IsActive(this IQueryable<User> u)
{
// Should really use UTC
return u.Where(x=>x.IsActive && x.ExpiryDate>DateTime.Now);
}
public static IQueryable<User> IsStaff(this IQueryable<User> u)
{
return u.Where(x=>x.Type==1);
}
}
像这样使用(具有完整的智能感知):
var result=db.Users
.IsActive()
.IsStaff()
.FirstOrDefault(x=>x.UserName=="MM001");
使用 Linq 和 Entity Framework 查询数据库时,有没有办法减少重复的 lambda?例如:
db.Users.FirstOrDefault(x => x.Username == "MM001" && x.Type == 1 && x.IsActive == True && x.ExpiryDate > DateTime.Now);
我想把它变成:
db.Users.FirstOrDefault(x => x.Username == "MM001" && x.IsActiveStaff());
我尝试将如下方法写入我的用户 POCO:
public bool IsActiveStaff()
{
return Type == 1 && IsActive == True && ExpiryDate > DateTime.Now;
}
但是,我收到以下错误:LINQ to Entities 无法识别方法 'Boolean IsActiveStaff()' 方法,并且无法将此方法转换为存储表达式。
我意识到这是因为 LINQ To Entities 无法将此方法转换为 SQL 表达式,但有什么方法可以让它工作吗?
我知道我可以写一个查询命令class,它只需要一个用户名作为参数,然后把我所有的逻辑都放在那里,但我想知道你是否可以嵌入一个系列将 lambdas 转化为方法或扩展方法等,并在需要时使用它们,就像我上面的例子一样。
创建适当类型的表达式:
Expression<Func<User, bool>> IsActiveStaff = x => x.Type == 1 && x.IsActive && x.ExpiryDate > DateTime.Now;
然后:
db.Users.Where(IsActiveStaff).FirstOrDefault(x => x.Username == "MM001");
我更喜欢使用如下扩展方法:
public static class UsersExtensions
{
public static IQueryable<User> IsActive(this IQueryable<User> u)
{
// Should really use UTC
return u.Where(x=>x.IsActive && x.ExpiryDate>DateTime.Now);
}
public static IQueryable<User> IsStaff(this IQueryable<User> u)
{
return u.Where(x=>x.Type==1);
}
}
像这样使用(具有完整的智能感知):
var result=db.Users
.IsActive()
.IsStaff()
.FirstOrDefault(x=>x.UserName=="MM001");