Примечание. Фактические сущности в моем проекте разные. Сценарий, который вы собираетесь прочитать, является упрощенным примером. Мой реальный пример затрагивает гораздо больше сущностей, чем перечислено здесь.
В моем проекте у меня есть следующие классы участников и групп:
public class Member
{
public string Name { get; set; }
public IList<Group> Groups { get; set; }
}
public class Group
{
public string Name { get; set; }
public IList<Member> Members { get; set; }
}
Моя реализация DbContext (код ModelBuilder опущен):
public class Db : DbContext
{
public DbSet<Group> Groups { get; set; }
public DbSet<Member> Members { get; set; }
}
Допустим, у меня есть требование, чтобы DbContext возвращал только те группы и участников, чье имя начинается с "X". Я могу реализовать это, изменив класс Db следующим образом:
public class Db : DbContext
{
public IQueryable<Group> Groups
{
get
{
return from g in ((IObjectContextAdapter)this).CreateQuery<Group>("SELECT VALUE Groups FROM Groups")
where g.Name.StartsWith("X")
select g;
}
}
public IQueryable<Member> Members
{
get
{
return from m in ((IObjectContextAdapter)this).CreateQuery<Member>("SELECT VALUE Members FROM Members")
where m.Name.StartsWith("X")
select m;
}
}
}
Теперь запросы, подобные следующим, возвращают только членов и группы с именами, начинающимися с «X»:
var members = db.Members.ToList();
var groups = db.Groups.ToList();
Проблема здесь связана с INCLUDES ...
var members = db.Members.Include(m => m.Groups).ToList();
var groups = db.Groups.Include(g => g.Members).ToList();
В то время как список «members» содержит только «members», имена которых начинаются с «X», свойство Groups содержит объекты Group с именами, которые не соответствуют. Тот же шаблон применяется к списку «групп» с несоответствующими объектами Member.
Есть ли в EF 4.2 функция, которую мне не хватает?
Как я могу повлиять на запросы, сгенерированные из свойств навигации?