我有一个带有导航属性 Settings
和只读属性 IsVisibleInApp
的 User
类。
目前这段代码有效:
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
是一个有效值。我想属性/方法不能在 DBSets
的 Where
子句中使用,因为它们被转换为 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/