使用 LINQ to Entities 的内部查询(子查询)返回列表中的 IEnumerable 列表

Posted

技术标签:

【中文标题】使用 LINQ to Entities 的内部查询(子查询)返回列表中的 IEnumerable 列表【英文标题】:Inner query(sub query) using LINQ to Entities that returns IEnumerable Lists within Lists 【发布时间】:2015-04-06 13:50:18 【问题描述】:

我正在尝试从表 Article 中获取文章列表,其中包含每篇文章所在的类别列表。假设文章“A”有 3 个类别“1”、“2”、“3”,而我的文章不止一个类别。我想在 ArticleViewModel 的列表中获取 CategoryViewModel 的列表。因为它是 IEnumerableList,所以当我使用 FirstOrDefault() 时,我在每篇文章下得到相同的类别名称,但我得到的文章数量是正确的。如何在文章(列表)中获取类别名称(列表)。

ArticleViewModel 类

公共类 ArticleViewModel 公共 int ArticleID 获取;放; 公共 int AuthorID 获取;放; 公共字符串作者姓名 获取;放; 公共字符串用户名 获取;放; 公共字符串蛞蝓得到;放; 公共字符串标题 获取;放; 公共字符串 ArticleContent 获取;放; 公共日期时间 PostDate 获取;放; 公共 Nullable 更新日期 获取;放; 公共 int ArticleCategoryID 获取;放; 公共 int 类别 ID 获取;放; 公共 IEnumerable 类别名称 获取;放; 公共 int TagID 获取;放; 公共字符串 TagName 获取;放;

CategoryViewModelClass

公共类 CategoryViewModel 公共 int 类别 ID 获取;放; 公共字符串类别名称 获取;放;

文章类别

公共部分类 ArticleCategory 公共 int ArticleCategoryID 获取;放; 公共 int ArticleID 获取;放; 公共 int 类别 ID 获取;放; 公共虚拟文章文章获取;放; 公共虚拟类别类别获取;放;

查询

result =(来自 db.Articles 中的文章
                在 db.ArticleCategories 上加入文章类别。ArticleID 等于 articlecategories.ArticleID
                在 articlecategories.CategoryID 上的 db.Categories 中加入 cat 等于 cat.CategoryID
                在文章中加入 db.Authors 中的身份验证。AuthorID 等于 auth.AuthorID
                选择新的 ArticleViewModel
                
                    AuthorName = auth.AuthorName,
                    用户名 = auth.UserName,

                    CategoryNames =(来自 db.Articles 中的 a
                                    //来自 db.ArticleCategories 中的 ca
                                    //从c in db.Categories group c by c.CategoryName into group1
                                    在 articlecategories.ArticleID 上的 db.ArticleCategories 中加入 ca 等于 ca.ArticleID
                                    在 cat.CategoryID 上的 db.Categories 中加入 c 等于 c.CategoryID 进入 group1
                                    选择新的 CategoryViewModel
                                    
                                        CategoryName = (从 group1 中的 group2 选择 group2.CategoryName).FirstOrDefault()
                                    // CategoryID = (from group2 in group1 select group2.CategoryID).FirstOrDefault()
                                    ),

                    标题=文章。标题,
                    蛞蝓=文章.蛞蝓,
                    文章内容 = 文章.文章内容,
                    PostDate = 文章.PostDate
                ).GroupBy(a => a.Title).Select(a => a.FirstOrDefault()).OrderByDescending(article => article.PostDate).ToList().ToPagedList(pageIndex, pageSize);

【问题讨论】:

【参考方案1】:

好的,几天后。我意识到这是试图让事情做得过火。我的错 !修复很简单;在视图模型中将类别更改为IEnumerable<string> Category get; set;

并将 LinQ 更改为

结果 =(来自 db.Articles 中的文章 在 db.ArticleCategories 上加入文章类别。ArticleID 等于 articlecategories.ArticleID 在 articlecategories.CategoryID 上的 db.Categories 中加入 cat 等于 cat.CategoryID 在文章中加入 db.Authors 中的身份验证。AuthorID 等于 auth.AuthorID 在文章中加入 db.ArticleTags 中的标签。ArticleID 等于 tags.ArticleID 选择新的 ArticleViewModel ArticleID=articles.ArticleID, AuthorName = auth.AuthorName, 用户名 = auth.UserName, 标题=文章。标题, 蛞蝓=文章.蛞蝓, 文章内容 = 文章.文章内容, PostDate = 文章.PostDate, CategoryNames = 从 icat inarticles.ArticleCategories 中选择 icat.Category.CategoryName, Tags = from itags in items.ArticleTags select itags.Tag.TagName ).GroupBy(a => a.Title).Select(a => a.FirstOrDefault()).ToPagedList(pageIndex, pageSize);

【讨论】:

以上是关于使用 LINQ to Entities 的内部查询(子查询)返回列表中的 IEnumerable 列表的主要内容,如果未能解决你的问题,请参考以下文章

LINQ to Entities 查询多对多表

有没有办法将简单的 LINQ 查询封装在可与 LINQ to Entities 查询一起使用的扩展方法中?

在实体框架和 Linq to Entities 中使用规范模式和表达式

Linq to Entities 中的动态 where 子句 (OR)

linq to entities查询使用大于小于匹配数据库字符串日期方法

查询 LINQ to Entities 中联系字段的属性