2016-04-25 2 views
0

пытается преобразовать запрос, который имеет 2 уровня, где в статьях linq и получить некоторые ошибки. Может ли кто-нибудь помочь мне в этом?Где в разделе с использованием linq

Оригинал запроса:

select id 
from student 
where suId 
in (select suId 
    from subjects 
    where cid 
    in (select id 
     from chapters 
     where chapter='C203')) 

LINQ запрос:

var query = (from s in dc.students 
     let subs = (from su in dc.subjects 
         where su.cid == Convert.ToInt32(from c in dc.Chapters 
                  where c.chapter == 'Ç203' 
                  select c.id) //Single chapter id will be returned 
         select su.suid) 
     where subs.Contains(s.sid) 
     select s.id).ToArray(); 

Am становится ниже 2 ошибки при компиляции приложения

  1. 'System.Linq.IQueryable' не содержит определения для «Содержит» и лучший метод перегрузки расширения »System.Linq.ParallelEnumerable.Contains (System.Linq.ParallelQuery, TSource) ' имеет некоторые недопустимые аргументы
  2. Instance аргумент: не может конвертировать из «System.Linq.IQueryable» до «» System.Linq.ParallelQuery

ответ

0

С Linq ленив загрузкой все, что вам не нужно втиснуть все в одно заявление; вы можете сделать что-то вроде этого:

var chapterIds = dc.Chapters 
    .Where(c => c.Chapter == "C023") 
    .Select(c => c.Id); 
var subjectIds = dc.Subjects 
    .Where(s => chapterIds.Contains(s.Cid)) 
    .Select(s => s.Suid); 
var students = dc.Students 
    .Where(s => subjectIds.Contains(s.Suid)) 
    .Select(s => s.Sid) 
    .ToArray(); 

Таким образом вы можете отлаживать каждый подзапрос, просматривая то, что он возвращает.

Однако, глядя на ваш оригинальный выбор вы можете переписать всю вещь как Join и избавиться от подслушивания вопроса:

var students = dc.Chapters.Where(c => c.Chapter == "C023") 
    .Join(dc.Subjects, 
     c => c.Id, 
     s => s.Cid, 
     (chapter, subject) => subject) 
    .Join(dc.Students, 
     subj => subj.Suid, 
     student => student.Suid, 
     (subj, st) => st.Sid) 
    .ToArray(); 
+0

кажется присоединиться к гораздо более простое решение. благодаря – user3625533

Смежные вопросы