Установите свойство навигации между C & B и между A & B. В этом и заключается весь смысл использования Entity Framework, а не просто альтернатива запросам ADO и SQL.
C содержит BId, поэтому настройте свойство навигации B:
public class C
{
public int CId { get; set; }
[ForeignKey("B")]
public int BId { get; set; }
public virtual B B { get; set; }
}
B содержит AId, аналогично:
public class B
{
public int BId { get; set; }
[ForeignKey("A")]
public int AId { get; set; }
public virtual A A { get; set; }
}
Теперь, чтобы написать запрос:
var cs = context.Cs.Where(x => x.B.AId == id);
или
var cs = context.Cs.Where(x => x.B.A.AId == id); // can filter on other "A" fields this way.
Я имею в виду, чтобы избежать использования свойств навигации, вы можете просто написать Sprocs и использовать ADO. Это возможно в тех случаях, когда у вас есть несвязанные таблицы или вам абсолютно необходимо избегать свойства навигации. Используйте Join
между context.Cs и context.Bs:
var cs = context.Cs.Join(context.Bs, c => c.BId, b => b.BId, (c, b) => new { C = c, AId = b.AId })
.Where(x => x.AId == aid)
.Select(x => x.C);
IMO серьезно уродливая работа с объединениями в EF, но иногда это необходимо. Если вы можете использовать свойство навигации, я настоятельно рекомендую использовать его регулярно.