Как создать список элементов из другого списка

#c# #linq

#c# #linq

Вопрос:

Как я могу создать список из элементов в другом списке?

     List<Post> postList = db.Posts.Where(u => u.PostId == postId).ToList();
    List<PostView> viewList = db.PostViews.Where(u => u.PostId **** is equal to PostId within postList**** );
 

Я использовал ****, чтобы показать, где мое понимание разваливается.

Комментарии:

1. Примеры использования linq см. в msdn. Я думаю, что в некоторых случаях вам нужно будет использовать метод объединения для объединения списка. В некоторых случаях после WHERE вам нужно будет использовать метод SELECT, чтобы получить только некоторые свойства класса вместо всего класса. code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

Ответ №1:

Вы можете select использовать идентификаторы из другого списка, а затем посмотреть, есть ли в этом списке contains ваш текущий идентификатор. Хотя сначала я бы сгенерировал список идентификаторов. Предполагая, что ваши идентификаторы имеют тип int:

 List<Post> postList = db.Posts.Where(u => u.PostId == postId).ToList();
List<int> postIds = postList.Select(u => u.PostId).ToList();
List<PostView> viewList = db.PostViews.Where(u => postIds.Contains(u.PostId)).ToList();
 

Комментарии:

1. Было бы лучше, если postIds бы HashSet

2. Все ответы кажутся близкими, но ваши и abion возвращаются со следующей ошибкой: не удается неявно преобразовать тип ‘System.Linq. IQueryable<App.Models. PostView>’ to’System. Коллекции. Generic.List<App.Models. PostView>’. Существует явное преобразование (вам не хватает приведения?) Есть идеи?

3. @DudeThatCodes Вы объявляли список<PostView>, но возвращали IQueryable . Моя вина, что я этого не уловил. Просто обновил свой ответ.

4. Я чувствую, что все, кто откликнулся, были довольно близки, но ваш сработал для меня лучше всего. Спасибо за помощь.

Ответ №2:

Дайте этому шанс:

 List<PostView> viewList = db.PostViews.Where(
    u => postList.Any(p => p.PostId == u.PostId));
 

Ответ №3:

 List<PostView> viewList = db.PostViews.Where(u => postList.Any(pl=>pl.postId == u.postId));
 

Но вы должны быть в состоянии сделать это одним выстрелом:

 List<PostView> viewList = db.PostViews.Where(u => u.Post.postId == postId);
 

или даже

 List<PostView> viewList = db.PostViews.Where(u => u.PostId == postId);
 

Кажется, у a postview есть post . Вам не нужно сначала получать список posts , а затем получать список views из этого списка.