【问题标题】:SQL subquery result in LINQ and Entity Framework Code FirstSQL 子查询导致 LINQ 和实体框架代码优先
【发布时间】:2012-11-13 06:43:58
【问题描述】:

我想进行一个查询,该查询将返回我的实体以及它们的关联实体之一。例如:

select *, (select COUNT(*) from Forms where Contact_Id = Contacts.Id) 
as FormsCount from Contacts;

我的联系人实体有一个名为 FormsCount 的属性,但它没有被映射,因为表中没有这样命名的列。是否可以编写一个 LINQ 查询来返回我填写了附加 FormsCount 属性的联系人实体?

或者,如果我可以在单独的字段中获取 FormsCount 值并且可以手动将它们复制到实体中,我会很高兴。查询的结果可能是这种形式,例如:

{
  Contact Contact;
  int FormsCount;
}

然后我可以遍历结果并将 FormsCount 复制到 Contact。也许这可以通过使用投影来实现?

我知道如何使用 2 个查询来做到这一点: a) 首先获取联系人实体 b) 为第一个查询中返回的联系人获取对或联系人 ID 和 FormsCount。

但我想使用一个查询来做到这一点。此外,我不希望 FormsCount 属性始终填写在我的联系人实体中,我希望对此进行控制。有什么想法吗?

谢谢, 迈克尔

【问题讨论】:

    标签: sql linq entity-framework ef-code-first


    【解决方案1】:

    关于投影你是对的。

    如果Contact 有一个导航属性Forms 你可以投影:

    from c in context.Contacts
    select new { Contact = c, FormsCount = c.Forms.Count() }
    

    如果没有,您将不得不使用子查询:

    from c in context.Contacts
    select new
    {
      Contact = c, 
      FormsCount = context.Forms.Count(f => f.Contact_Id == c.Id)
    }
    

    EF 将在一个 SQL 查询中处理这两种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多