我喜欢在可能的情况下使用扩展方法编写我的查询。所以下面是对我的作品的查询:实体框架IQueryable扩展方法不能用作子查询
int studentId =
(
from u in db.Users
.FromOrganisation(org.Id)
.IsStudent()
.IsActive()
where u.ExtId == dto.StudentExtId
select u.Id
).FirstOrDefault();
扩展方法如下:
public static IQueryable<User> IsStudent(this IQueryable<User> u)
{
return u.Where(x => x.Type == (int)UserTypes.Student);
}
然而,当我使用扩展方法在一个子查询,我得到了以下信息:
LINQ实体无法识别方法“System.Linq.IQueryable`1 [eNotify.Domain.Models.User] IsActive(System.Linq.IQueryable`1 [eNotify.Domain.Models.User]) '方法,并且这种方法不能被翻译成商店表达。
这是导致该消息查询:
var vm = from o in db.Organisations
select new StaffStudentVm
{
StudentId = (
from u in db.Users
.FromOrganisation(org.Id)
.IsStudent()
.IsActive()
where u.ExtId == dto.StudentExtId
select u.Id
).FirstOrDefault(),
StaffId = (
from u in db.Users
.FromOrganisation(org.Id)
.IsStaff()
.IsActive()
where u.ExtId == dto.StaffExtId
select u.Id
).FirstOrDefault()
};
return vm.FirstOrDefault();
我在做什么错?
更新: Alexander Derck发布了一个运行良好的解决方案,但不像原始问题查询那么好。我与EF团队一起提出了这个问题,调查后他们提出了一个更优雅的解决方法。我已经在下面公布了接受的答案。
你可以链接你的'IsActive()'方法吗?根据错误消息,您可能正在做一些无法转换为sql的内容 –
这不是IsActive方法。如果我在查询中注释它,它只会报告下一个扩展方法作为问题。 –
也许你可以使用表达式而不是扩展方法? –