2017-02-09 5 views
0

У меня есть класс пользователи с следующим форматом:LINQ Включить близлежащую коллекцию (около таблицы) и свойство

List<Subscriptions> Subscriptions {get;set;} 

И классом подписки содержит:

SubscriptionType type {get;set;} 

Я хотел бы, чтобы включить все эти в объект User:

var _referredUser = ctx.Users 
           .Include(x=>x.Subscriptions.Where(y=>y.Status==true)) 
           .ToList() 
           .FirstOrDefault(y => y.Email == _all[i].Referred_email); 

Я могу успешно включить сбор подписей, но я не как я могу пойти дальше за подпиской и включить свойство SubscriptionType в объект User, если это возможно?

Мой другой вопрос также заключается в том, могу ли я включать только те подписки, которые имеют статус == true, потому что пользователь может иметь несколько записей в таблице подписки и только один, который установлен в true?

Я пытался что-то вроде этого, но он бросает мне ошибку:

.Include(x=>x.Subscriptions.Where(y=>y.Status==true)) 

Ошибка является:

The Include path expression must refer to a navigation property defined on the type. Use dotted paths for reference navigation properties and the Select operator for collection navigation properties. 

Может кто-то помочь мне с этим LINQ?

ответ

2

Вы не можете выбирать в Include, я рекомендую вам сделать это:

var email=_all[i].Referred_email; 
var _referredUser = ctx.Users.Include(x=>x.Subscriptions.Select(y=>y.SubscriptionType)) 
          .FirstOrDefault(y => y.Email == email && y.Subscriptions.Any(y=>y.Status)); 

Как сказало исключение, вы должны ссылаться свойством навигации в Include

+0

проверить ответ Шейна, работает довольно приятно =) – User987

+0

По-видимому, он может использовать оператор select внутри самого оператора include ..? – User987

+1

Да, но вы можете использовать 'Select', чтобы включить другой внутренний уровень, ссылаясь на другое свойство навигации, вы не можете использовать' Where' внутри фильтра – octavioccl

2

Что-то, как это должно работать ...

var email = _all[i].Referred_email; 
var _referredUser = ctx.Users 
    .Include(x=>x.Subscriptions.Select(y=>y.SubscriptionType)) 
    .Select(x => new { User = x, Subscriptions = x.Subscriptions.Where(subscription => subscription.Status)}) 
    .Where(x => x.Subscriptions.Any()) 
    .Select(x => x.User) 
    .FirstOrDefault(y => y.Email == email); 

Чтобы включить свойства детей, которые можно использовать Select в заголовочном заявлении. Чтобы получить результаты, когда Subscriptions.Status истинна, вам нужно будет сделать отдельный запрос или сделать мануал Select().

+0

Шейн, вау вашего решения выглядит аккуратно и чист, держись, я попробую это =) – User987

+0

Шейн, как мне теперь получить доступ к свойству subscriptiontype внутри коллекции подписчиков? – User987

+0

Я сделал обновление, так как оператор Where() не будет фильтровать дочерний список (и не был действительным синтаксисом), он просто исключил бы объекты пользователей, у которых не было «Status == true». Дайте мне минуту, и я напишу GroupBy, который должен делать то, что вы хотите. –