【问题标题】:Entity Framework How to fill NotMapped Property that need a join?实体框架如何填充需要连接的 NotMapped 属性?
【发布时间】:2018-01-20 06:41:55
【问题描述】:

我有一个 PostInfo 表和 LikeInfo 表,PostInfo 有 LikeInfo 列表(用于帖子喜欢)。PostInfo 表有一个名为“LikeCount”的 NotMapped 属性。 我想选择 PostInfoes 列表并加入 LikeInfo 表并计算帖子的 LikeInfoes 计数并将此计数填充到 LikeCount 属性。

这是我的示例:

        var query = context.PostInfoes.Where(x => x.UserId == userId).Include(x => x.LikeInfoes);
        foreach (var item in query)
        {
            item.LikeCount = item.LikeInfoes.Count;
        }
        return query.ToList();

这对我来说不是一个好方法,因为我在查询中执行 foreach 并手动设置 LikeCount 但是在这种情况下我不希望/不需要包含 LikeInfo 表的完整人员

我正在寻找填充此属性的最佳且简单的方法。

【问题讨论】:

  • 看来您需要为此使用join
  • 是的,但是加入我搜索的问题是我必须做 .Select(x => new PostInfo() { LikeCount = x.LikeInfoes.Count });我必须手动填写所有其他数据不是好方法吗?
  • 您可以将 LikeCount 转换为计算字段

标签: c# join entity-framework-6


【解决方案1】:

由于 EF6 不允许投影到实体类型,您需要使用包含所有必要数据的中间匿名类型投影的 LINQ to Entities 查询,然后切换到 LINQ to Objects(通过AsEnumerable())并使用用于执行必要的未映射属性修复的委托块:

var result = context.PostInfoes
    .Where(x => x.UserId == userId)
    .Select(x => new { Info = x, LikeCount = x.LikeInfoes.Count() })
    .AsEnumerable()
    .Select(x =>
    {
        x.Info.LikeCount = x.LikeCount;
        return x.Info;
    })
    .ToList();

【讨论】:

  • @Monah Lol,在AsEnumerable() 之后 - 是的!但在此之前(IQueryable 部分)正在创建和执行数据库查询。
  • 谢谢你,我认为这是最好的办法,因为:没有双重查询和懒惰的查询,只是使用一个技巧:)
  • 谢谢!我喜欢这个解决方案,因为它允许您将未映射的属性添加到 EF 实体,但仍确保通过查询对其进行设置,因此您永远不会使用“部分填充的对象”。我设想能够将其用于具有可选“包含”类型语句的 API 调用,然后具有未映射的可为空属性,这些属性仅在请求时设置。这对于计数和其他不需要的其他元信息非常有用。它甚至确保实体仍被跟踪,因此它们不是投影。美丽的。正是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多