2014-12-30 8 views
2

У меня есть ресурс и ResourceDetail. MemberPoint с memberId и ResourceId.EF include with where clause

Я хотел бы получить информацию о ресурсах для члена.

В 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

ответ

1

Вы можете попробовать использовать включить этот путь:

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 
      }) 
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)) 
+0

Не уверен, что это сработает, поскольку вы сравниваете равенство между одним идентификатором и коллекцией Memberpoints. –

+0

Это будет, если MemberPoint.MemberId уникален. Но я удалю ответ, если заявлено OP – agentpx

2

Вы используете EF полностью неправильно.

То, что вы хотите на самом деле

Если ResourceDetails имеет один ресурс и каждый 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 должен иметь ассоциации в сопоставлениях и уже знает, как объединить сущности вместе.

+0

Привет, Арон, я хотел бы фильтровать by member. любезно объясните, как добавить Memberpoints.MemberId == 1 в EF. –