有条件地包含在 asp.net 核心和实体框架中



我刚刚使用 asp.net 核心开始了我的第一个项目,并且我第一次在C#和VS 2019中使用代码存储库。 我创建了一个新模型,它称为注释。此表可以保存对项目的所有评论,这意味着是用户评论在帖子,社交媒体等中保存的区域

[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 数据列表,但我无法将我的结果包含在注释表中,并且注释部分中的代码存储库的结果始终为 null。

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();
}

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

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

您需要添加来自 AnalysedMarket 的引用,以便在您的 AnalysedMarket-Class 中发表这样的评论:

ICollection<Comment> Comments { get; set; }

然后在查询您的分析市场时包括它们,如下所示:

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

/编辑: 关于您的评论 - 为此,您需要一种层次结构/继承结构。它似乎得到了EfCore的支持,这样的事情应该可以工作:

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

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

最新更新