2015-05-26 3 views
0

Добрый день!Использование результатов запроса linq в другом запросе linq

Скажите, можно ли использовать результат запроса Linq в другом запросе Linq? Например:

List<Member> memberList = db.Members.Where(m=>m.Year == 20013).ToList(); 
var result = (from members in memberList 
      from documents in Archive.Where(d=>d.MemberId = members.Id).DefaultIfEmpty() 
      select new ArchiveRecord 
      { 
       member = members, 
       documentId = documentsId 
      }).ToList(); 

В то же время реализация второго запроса падает с ошибкой (Существует уже открытая DataReader, связанная с этой командой, которая должна быть закрыта первой).

Скажите, пожалуйста, где я совершил ошибки.

Спасибо!

ответ

0

Я не знаю, как сделать вложенный запрос linq, но у меня есть решение для вас. Попробуйте это:

List<Member> memberList = db.Members.Where(m => m.Year == 20013).ToList(); 
var membersIds = memberList.Select(m => m.Id); 
var result = (from documents in Archive.Where(d => membersIds.Contains(d.MemberId)).DefultIfEmpty() 
      select new ArchiveRecord 
      { 
       member = members, 
       documentId = documentsId 
       }).ToList(); 
+0

I подумайте, что вы можете использовать IEnumerable вместо List и удалить ToList() первого запроса, чтобы не выполнить первый запрос –

+0

@ Béranger True, но обратите внимание, что это, вероятно, 'IQueryable', так как это выглядит как EF. – juharr

+0

Да, я просто скопировал его пример и отредактировал его. –

0

Я считаю, что это должно работать (один запрос):

var memberList = db.Members.Where(m=>m.Year == 20013); 
var result = (from members in memberList 
     from documents in Archive.Where(d=>d.MemberId = members.Id).DefaultIfEmpty() 
     select new ArchiveRecord 
     { 
      member = members, 
      documentId = documentsId 
     }).ToList(); 

Это определенно должно работать (Одиночный запрос):

var result = (from members in db.Members 
     from documents in Archive.Where(d=>d.MemberId = members.Id).DefaultIfEmpty() 
     where members.year == 20013 
     select new ArchiveRecord 
     { 
      member = members, 
      documentId = documentsId 
     }).ToList(); 

и это (два запроса):

var membersIds = db.Members 
    .Where(m => m.Year == 20013) 
    .Select(m => m.Id) 
    .ToList(); 

var result = (from documents in Archive.Where(d => membersIds.Contains(d.MemberId)).DefultIfEmpty() 
      select new ArchiveRecord 
      { 
       member = members, 
       documentId = documentsId 
       }).ToList(); 

и это предполагается, что вы создали свойство навигации на член архива, и это 1-многих (один запрос):

var result=db.Archives 
    .Where(a=>a.Member.Year==20013) 
    .Select(a=> new ArchiveRecord { 
    member=a.Member, 
    documentId=a.documentsId 
    }).ToList(); 
Смежные вопросы