【问题标题】:Conditional Include in asp.net core and Entity Framework条件包含在 asp.net 核心和实体框架中
【发布时间】:2019-06-04 15:01:26
【问题描述】:

我刚刚使用 asp.net 核心开始了我的第一个项目,并且我将第一次在 C# 和 VS 2019 中为我的项目使用代码存储库。 我创建了一个新模型,它名为 Comment。该表可以保存项目中所有的cmets,即用户在POSTS、SOCIALMEDIA等领域的cmets都保存在该表中

[Key]
public int CommentId { get; set; }

public eTable Table { get; set; }

public int ContentId { get; set; }

[StringLength(1500)]
public string Notes { get; set; }

public virtual AnalysedMarket AnalysedMarket { get; set; }

ContentID 是我的外键,我的 eTable 枚举类型如下所示:

public enum eTable
{
    AnalysedMarket,
    Blog,
    News,
    Migration,
}

我还为 AnalysedMarket 创建了一个新类,以保存我们社交媒体区域中的用户数据。

[Key]
public int AnalysedMarketId { get; set; }

[StringLength(255)]
public string Images { get; set; }

public int Hits { get; set; }

public string Notes { get; set; }``

现在我在我的代码存储库中创建了一个方法,用于使用 EF 和 LINQ 提取数据以获取 AnalysedMarket 数据列表,但我无法将我的结果包含在注释表中,并且我的代码存储库在注释部分的结果始终为空。

public async Task<IEnumerable<AnalysedMarket>> List(int? page, int? perPage, eStatus? status, string userId)
{
  var query = _db.AnalysedMarkets.Select(a => a);

  if (status.HasValue)
      query = query.Where(m => m.Status.Equals(status));

  if (!string.IsNullOrEmpty(userId))
      query.Where(m => m.CreatedBy.Equals(userId));

  query.Include(a => a.Comments.Where(c => c.Table.Equals(eTable.AnalysedMarket) && c.ContentId == a.AnalysedMarketId));

  if (page.HasValue && perPage.HasValue)
      return await query.OrderBy(a => a.AnalysedMarketId).ToPagedListAsync(page.Value, perPage.Value);
  else
      return await query.OrderBy(a => a.AnalysedMarketId).ToListAsync();
}

实际上我的问题是如何获取评论数据中包含的 AnalysedMarket 数据列表。 它有一个条件,如果 ContentId 等于 AnalysedMarketId 并且 eTable 是 Table.AnalysedMarket,则包含注释。

我阅读了有关条件包含的文章,但没有得到任何内容。 Example 1 Example 2

【问题讨论】:

  • 您必须从引用的表中加载结果,就像 _db.Comment.Select(a => 不管条件是什么).Include(x => x.AnalysedMarket)
  • @man_luck 没有办法从 AnalysedMarket 端加载数据??因为我只解释了其中一种关系,但表之间的关系不止几种

标签: c# entity-framework linq asp.net-core


【解决方案1】:

您需要添加来自 AnalysedMarket 的引用才能在您的 AnalysedMarket-Class 中进行这样的评论:

ICollection<Comment> Comments { get; set; }

然后在像这样查询您的 AnalysedMarkets 时包含它们:

var query = _db.AnalysedMarkets.Include(c => c.Comments);

/编辑: 关于您的评论-为此,您需要一种层次结构/继承结构。似乎be supported by EfCore 和这样的东西应该可以工作:

public class CommentableItem {
    ICollection<Comment> Comments {get;set;}
}

public class Comment {
    CommentableItem CommentableItem {get;set;}
}

public class AnalysedMarket : CommentableItem {
}

您应该能够对从 CommentableItem 继承的每个项目使用包含。我还没有使用继承功能(据我所知,这对于 EF Core 来说是相当新的),所以进一步说明check the documentation

【讨论】:

  • 以通常的方式工作,但问题是评论表也保存其他表评论。这意味着 cmets 来自 Blog News AnalysedMarket 等并保存在此表中
  • 我更新了关于您的问题的答案。请检查它是否有帮助。
猜你喜欢
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 2019-11-08
  • 2015-12-21
  • 2020-05-10
相关资源
最近更新 更多