entity-framework - Entity Framework Linq 将 lambda 表达式嵌入到可重用函数中

标签 entity-framework linq linq-to-sql lambda linq-to-entities

当使用带有 Entity Framework 的 Linq 查询数据库时,有没有办法减少重复的 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 表达式,但有什么方法可以让它工作吗?

我知道我可以编写一个查询命令类,它只需将用户名作为参数,并将我的所有逻辑都放在其中,但我想知道你是否可以将一系列 lambda 嵌入到方法中或扩展方法等,并在需要时使用它们,就像我上面的例子一样。

最佳答案

我更喜欢使用以下扩展方法:

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

关于entity-framework - Entity Framework Linq 将 lambda 表达式嵌入到可重用函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33616092/

相关文章:

c# - 无法通过将自己指定为父级来确定相关操作的有效顺序

c# - 从 Entity Framework Core 中的导航属性选择对象列表

entity-framework - Entity Framework 代码优先和存储过程

c# - 在 umbraco 中构建 Linq 查询

c# - "LINQ to Entities does not recognize the method ' Int32 Parse(System.String)' 的解决方法

c# - 有两个表的谓词生成器

.net - 在 Mono 上的 Linq 到 SQL?

c# - 在 Entity Framework 中关闭 AutoDetectChangesEnabled 可能存在的风险

c# - 我如何将代码更改为linq样式

c# - Linq - 使用 linq 在列表中获取不可用的 ID