2013-04-04 1 views
2

У меня есть следующие структуры таблицы:Linq к выбору Sql элементов с кол вложенной

enter image description here

Использование Linq To SQL Я хочу, чтобы получить список, как это:

new { 
    E = e,  // the E object 
    Ds = e.Ds, // list of D objects referenced by E 
    NumAs = ??? // COUNT OF A objects that are eventually associated with this E 
} 

НО , Я хочу, чтобы эти вещи сортировались по числу A, связанным с каждым E.

Я пытался использовать комбинацию joins/orderby и вложенных запросов, Я не знаю, как это получить.

Если я сделаю ссылку из таблицы E в A, тогда она кажется тривиальной; То есть это:

enter image description here

from e in ctx.E 
orderby e.As.Count() 
select new { 
    E  = e, 
    Ds = e.Ds, 
    numAs = e.As.Count() 
} 

Но делает эту ссылку на нарушение какой-то правила нормализации БД?

ответ

1

Вы можете просто сделать это

from e in ctx.E 
let ds = e.Ds 
let cs = ds.SelectMany(d => d.Cs) 
let as = cs.SelectMany(c => c.As) 
orderby as.Count() 
select new { 
    E  = e, 
    Ds = e.Ds, 
    numAs = as.Count() 
} 

Или это для краткости

from e in ctx.E 
let as = e.Ds.SelectMany(d => d.Cs).SelectMany(c => c.As) 
orderby as.Count() 
select new { 
    E  = e, 
    Ds = e.Ds, 
    numAs = as.Count() 
} 

Другой способ сделать это может быть, чтобы начать с A с и группы их, как это:

from a in ctx.A 
group a by a.C.D.E into g 
orderby g.Count() 
select new { 
    E = g.Key, 
    Ds = g.Key.Ds, 
    numAs = g.Count() 
} 
+0

Отличный ответ! Используя ваш третий пример, я могу легко фильтровать на основе определенного B. –

+1

@MikeCaron рада помочь :) –

1

Ну, просто следуйте своим отношениям сущностей все время:

ctx.E.Select(e => new { 
       E = e 
       , Ds = e.Ds 
       , numAs = e.Ds.SelectMany(d => d.Cs).SelectMany(c => c.As).Count() 
       } 
      ) 
    .OrderBy(e => e.numAs); 

e.Ds.SelectMany(d=>d.Cs) дает вам все Cs, связанные с вашим e через Ds.
И снова SelectMany(c => c.As) дает вам все, что связано с вашим e через Cs и Ds.

+1

Ваш ответ тоже был хорош, но я выбрал @ p.s.w.g, так как он предоставил больше способов добраться до него. –

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