我是Resource and ResourceDetail。 MemberPoint with memberId和ResourceId。
我想获得会员的资源详情。
在SQL中,
Select d.* From ResourceDetails d Inner Join
Resource on r d.ResourceId = r.Id Inner Join
MemberPoint mp on r.id = mp.ResourceId
where mp.memberId = 1
在EF中,
var query = _context.ResourceDetails
.Include(d => d.Resource)
.Include(r => r.Resource.Memberpoints)
.Where(e => e.Resource.Memberpoints.Where(m => m.MemberId))
我在上面写EF查询时遇到错误。
错误:未知方法' System.Linq.IQueryable的位置(?)'
答案 0 :(得分:2)
您可以尝试以这种方式使用:
var query = _context.MemberPoint.Include("Resource.ResourceDetails")
.Where(m => m.MemberId == 111111);
或尝试加入resourceId并选择包含所需数据的匿名类型:
var query = (from m in _context.MemberPoint
join rd in _context.ResourceDetails on m.ResourceId equals rd.ResourceId
where m.MemberId == 11111
select new
{
Member = m,
ResourceDetail = rd
})
答案 1 :(得分:2)
您完全错误地使用EF。
你想要的实际上是
如果ResourceDetails有一个Resource且每个reasource都有一个成员(不太可能)。
var query = _context.ResourceDetails
.Include(d => d.Resource)
.Include(r => r.Resource.Memberpoints)
.Where(d => d.Resource.Memberpoints.MemberId == 1);
如果ResourceDetails有一个资源,每个资源可以有多个成员。
var query = _context.ResourceDetails
.Include(d => d.Resource)
.Include(r => r.Resource.Memberpoints)
.Where(d => d.Resource.Memberpoints.Any(m => m.MemberId == 1));
如果ResourceDetails有多个资源(不太可能),并且每个资源可以有多个成员。
var query = _context.ResourceDetails
.Include(d => d.Resource)
.Include(r => r.Resource.Memberpoints)
.Where(d => d.Resource.Any(r => r.Memberpoints.Any(m => m.MemberId == 1)));
好。那么你想要的加入呢?那就是ORM的工作。 ORM映射已经知道ResourceDetails
与Members
的关联方式。
那你得到的错误是什么?
好吧,IQueryable.Where()
的签名需要Func<T, bool>
并返回IQueryable<T>
。
因此,在您的示例中,内部Where
是错误的,因为您给它Func<T, int>
。外部Where
是错误的,因为您正在向它传递IQueryable<T>
(尽管编译器不知道因为它已经存在各种错误)。
TL:DR
一般情况下,不要加入EntityFramework / Linq。 EF应该在映射中具有关联,并且已经知道如何将实体连接在一起。
答案 2 :(得分:0)
假设根据您的查询示例,MemberId是唯一的。试试这个
var query = _context.ResourceDetails
.Include(d => d.Resource)
.Include(r => r.Resource.Memberpoints)
.Where(e => e.ResourceId == e.Resource.Memberpoints.Where(m => m.MemberId == 1))