2016-04-25 9 views
0

versucht, eine Abfrage zu konvertieren, die 2 Ebenen von Where in-Klauseln zu linq hat und einige Fehler zu bekommen. Kann mir jemand dabei helfen?Where in-Klausel mit linq

Original-Abfrage:

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

LINQ-Abfrage:

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 unter 2 Fehler bekommen, während app kompilieren

  1. 'System.Linq.IQueryable' enthält keine Definition für 'Enthält' und die beste Erweiterungsmethode 'System.Linq.ParallelEnumerable.Contains (System.Linq.ParallelQuery, TSource)' einige ungültige Argumente
  2. Instanz Argument hat: Konvertierung von ‚System.Linq.IQueryable‘ auf ‚System.Linq.ParallelQuery‘

Antwort

0

Da Linq ist faul-Laden alles was Sie brauchen nicht alles zu stopfen in eine einzelne Aussage; Sie können etwas wie folgt tun:

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(); 

Auf diese Weise können Sie jede Unterabfrage debuggen, indem Sie betrachten, was es zurückgibt.

jedoch bei Ihrer ursprünglichen suchen wählen Sie das Ganze als Join umschreiben können und das Lausch Problems loszuwerden:

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

scheint zu verbinden ist viel einfachere Lösung. Vielen Dank – user3625533