SQL子查询导致LINQ和实体框架代码优先

Mic*_*zyk 2 sql linq entity-framework ef-code-first

我想做一个查询,它将返回我的实体和其他一些相关实体.例如:

select *, (select COUNT(*) from Forms where Contact_Id = Contacts.Id) 
as FormsCount from Contacts;
Run Code Online (Sandbox Code Playgroud)

My Contact实体有一个名为FormsCount的属性,但它没有映射,因为表中没有列出类似的列.是否可以编写一个LINQ查询,它将返回我的联系实体,并填写了额外的FormsCount属性?

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

{
  Contact Contact;
  int FormsCount;
}
Run Code Online (Sandbox Code Playgroud)

然后我可以迭代结果并将FormsCount复制到Contact.也许这可以通过使用预测来实现?

我知道如何使用2个查询来执行此操作:a)首先获取联系人实体b)获取第一个查询中返回的联系人的联系ID或联系人ID和FormsCount.

但我想使用一个查询来做到这一点.另外,我不希望我的Contact实体中始终填充FormsCount属性,我希望能够控制它.有任何想法吗?

谢谢,米哈尔

Ger*_*old 6

你对投射是对的.

如果Contact有导航属性,Forms您可以投影:

from c in context.Contacts
select new { Contact = c, FormsCount = c.Forms.Count() }
Run Code Online (Sandbox Code Playgroud)

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

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

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