首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架核心2.0选择具有多对多问题的查询

实体框架核心2.0选择具有多对多问题的查询
EN

Stack Overflow用户
提问于 2018-09-19 18:27:42
回答 4查看 1.9K关注 0票数 0

下面是模型。

代码语言:javascript
复制
class Product
{
    public int Id { get; set; }
    public ICollection<Categorization> Categorization { get; set; }
}

class Categorization
{
    public int ProductId { get; set; }
    public Product Product { get; set; }

    public int CategoryId { get; set; }
    public Category Category { get; set; }
}

class Category
{
    public int Id { get; set; }
    public ICollection<Categorization> Categorization { get; set; }
}

我试图列出所有的产品和他们的类别以及。API代码如下

代码语言:javascript
复制
foreach (var product in _context.Products.ToList()){
    var categories = product.Categorization.Select(c => c.Category);
    ...     
}

当我们调用Api时,我得到以下错误:

System.ArgumentNullException:值不能为空。 参数名称:源 在System.Linq.Enumerable.SelectTSource,TResult

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-09-19 18:35:14

product.Categorization是空的,因为它没有加载。如果期望延迟加载来处理负载,则必须使product.Categorization属性变为虚拟(以及希望在Categorization类中加载的属性,在本例中为Category )

编辑:在您的示例中,您应该希望使用IncludeThenInclude加载数据,因为您知道需要这些数据:

代码语言:javascript
复制
_context.Products
   .Include( p => p.Categorization )
   .ThenInclude( c => c.Category )
   .ToList()
票数 1
EN

Stack Overflow用户

发布于 2018-09-20 01:46:36

为了查询所有产品及其类别,您可以尝试使用IncludeThenInclude,如下所示:

代码语言:javascript
复制
        public async Task<IActionResult> GetAllArticleAsync()
    {
        var articles = await _context.Articles
                               .Include(a => a.ArticleTags)
                               .ThenInclude(at => at.Tag)
                               .Select(a => new
                               {
                                   Id = a.Id,
                                   ArticleName = a.ArticleName,
                                   Tags = a.ArticleTags.Select(at => at.Tag).ToList()
                               })
                               .ToListAsync();
        return Ok(articles);
    }

为此,您需要在opt.SerializerSettings.ReferenceLoopHandling中配置Startup.cs,如下所示:

代码语言:javascript
复制
        services.AddMvc()
                .AddJsonOptions(opt => opt.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);

要获得完整的演示,请参阅EFCorePro

票数 1
EN

Stack Overflow用户

发布于 2018-09-19 18:37:34

尝试添加虚拟对象,如下所示:

代码语言:javascript
复制
class Product
{
    public int Id { get; set; }
    public virtual ICollection<Categorization> Categorization { get; set; }
}

class Categorization
{
    public int ProductId { get; set; }
    public virtual Product Product { get; set; }

    public int CategoryId { get; set; }
    public virtual Category Category { get; set; }
}

class Category
{
    public int Id { get; set; }
    public virtual ICollection<Categorization> Categorization { get; set; }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52412120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档