我喜歡在可能的情況下使用擴展方法編寫我的查詢。所以下面是對我的作品的查詢:實體框架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方法。如果我在查詢中註釋它,它只會報告下一個擴展方法作爲問題。 –
也許你可以使用表達式而不是擴展方法? –