c# - Entity Framework Core LINQ 类属性/方法不能使用包含的属性

标签 c# entity-framework linq entity-framework-core

我有一个带有导航属性 Settings 和只读属性 IsVisibleInAppUser 类。

目前这段代码有效:

var users = context.Users.Include(x => x.Settings)
   .Where(x => x.Settings.IsApproved && x.Settings.IsAvailable && x.UserType == 2);

但我必须经常使用这些检查,所以我尝试使用一个属性,它在运行时将 Settings 设置为 null。

这是我的代码。

public bool IsVisibleInApp
{
  get
  {
    return this.Settings.IsApproved && this.Settings.IsAvailable && this.UserType == 2;
  }
}

...
...

void SomeMethod(){
    var users = context.Users.Include(x => x.Settings)
       .Where(x => x.IsVisibleInApp).ToList();

我可以看到外键 this.SettingsID 是一个有效值。我想属性/方法不能在 DBSetsWhere 子句中使用,因为它们被转换为 SQL? 但是肯定有解决这个问题的方法......或者我必须先做一个 .ToList() 然后再使用一个 .Where 调用,但这意味着从数据库中提取所有行,这似乎有很多额外的工作......

最佳答案

你不能按照你想要的方式去做(EF 不会进入你的属性 getter 并查看你在那里做了什么),但你可以通过将其包装在静态表达式中来减少代码重复:

public static Expression<Func<User, bool>> IsVisibleInAppExpression = x =>
    x.Settings.IsApproved && x.Settings.IsAvailable && x.UserType == 2;

然后像这样使用:

var users = context.Users.Include(x => x.Settings)
   .Where(User.IsVisibleInAppExpression).ToList();

或者通过创建扩展方法:

public static class Extensions {
    public static IQueryable<User> VisibleInAppOnly(this IQueryable<User> query) 
    {
         return query.Where(x => 
             x.Settings.IsApproved && x.Settings.IsAvailable && x.UserType == 2);
    }
}

然后像这样使用:

var users = context.Users.Include(x => x.Settings).VisibleInAppOnly();

关于c# - Entity Framework Core LINQ 类属性/方法不能使用包含的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47472687/

相关文章:

c# - IEnumerable 包含 IEnumerable

c# - 如何舍入 C# 双可空类型?

c# - ReflectionOnly 加载上下文的问题

linq - 使用反射获取 linq 查询中的选择字段

c# - 在 VS 2015 和 EF7 从模型生成 SQLite 数据库

c# - 将字符串转换为 Linq.Expressions 或使用字符串作为选择器?

linq - 在 LINQ 查询中使用组

c# - 如何使用 System.Runtime.Serialization.Json 解析这个字符串?

c# - SMTPException 其中一个流已被使用,无法重置为原点

c# - 实现业务逻辑验证的最佳实践 - Entity Framework