Фильтруйте результаты перед FirstOrDefault () и затем с помощью FirstOrDefault () - PullRequest
0 голосов
/ 30 января 2012

Я хочу сделать что-то подобное;

Context.Users.Include("Addresses", a => a.IsRowDeleted == false).FirstOrDefault(u => u.UserId == 5);

Я имею в виду;Я хочу отфильтровать включенные объекты, но не всегда, они также должны быть необязательными.

Каково лучшее решение для этого?Пожалуйста, помогите мне,

Ответы [ 2 ]

3 голосов
/ 30 января 2012

Вы не можете фильтровать загруженные данные в EF.Include Операция не поддерживает фильтрацию или сортировку.

Вы должны использовать либо проекцию на пользовательский тип (или анонимный тип):

var query = from u in context.Users
            where u.UserId == 5
            select new UserFiltered 
                { 
                    User = u,
                    Addresses = u.Addresses.Where(a => !a.IsRowDeleted)
                };
UserFiltered u = query.FirstOrDefault();

Или вы должны разделить ваш запрос на два отдельныхзапросы и использовать явную загрузку:

context.ContextOptions.LazyLoadingEnabled = false;
var user = context.Users.FirstOrDefault(u => u.UserId == 5);
((EntityCollection<Address>)user.Addresses)
     .CreateSourceQuery()
     .Where(a => !a.IsRowDeleted)
     .Execute();               

Или вы можете просто использовать два запроса:

var user = context.Users.FirstOrDefault(u => u.UserId == 5);
var addresses = context.Addresses.Where(a => a.User.UserId == 5 && !a.IsRowDeleted).ToList();
2 голосов
/ 30 января 2012

Вы имеете в виду что-то вроде (предупреждение: непроверенный код):

Context.Users.SingleOrDefault(u => u.Addresses.Where(a => a.IsRowDeleted == false).Count > 0) && u.UserId == 5);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...