我想进行一个查询,该查询将返回我的实体以及与其关联的实体之一的数量。例如:
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实体中,我想对此进行控制。有任何想法吗?
谢谢,米哈尔
您对投影的看法是正确的。
如果Contact具有导航属性Forms,则可以进行以下投影:
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查询中处理这两种情况。