一尘不染

LINQ和Entity Framework代码优先的SQL子查询结果

sql

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

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

我的Contact实体具有一个名为FormsCount的属性,但由于没有在表中命名的列,因此未映射该属性。是否可以编写一个LINQ查询,使我返回具有填充的其他FormsCount属性的Contact实体?

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

{
  Contact Contact;
  int FormsCount;
}

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

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

但是我想使用一个查询来做到这一点。另外,我不希望FormsCount属性始终填充在我的Contact实体中,我想对此进行控制。有任何想法吗?

谢谢,米哈尔


阅读 156

收藏
2021-03-08

共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查询中处理这两种情况。

2021-03-08