此代码有效,但是我希望有一个单独的SQL执行来选择Phones并链接到其对应的人。我该怎么办?
var persons = personsRepository.Query()
.Select(x => new PersonDto
{
Name = x.Name,
Emails = x.Emails.Select(y => y.Email),
Phones = x.Phones.Select(y => y.Number)
}).ToList();
使用“包含以下”功能-执行两个SQL查询,一个用于个人电子邮件加入,另一个用于个人电话,最后人们在其个人列表中包含其电子邮件和电话。但是我想限制对我需要的字段(即电子邮件和数字)的选择。这就是为什么我更喜欢像上面的代码那样使用Select(投影)。
var persons = personsRepository.Query()
.Include(x => x.Emails)
.ToList();
persons = personsRepository.Query()
.Include(x => x.Phones)
.ToList();
为简洁起见,我省略了必须包含/加入个人的其他6个实体。
答案 0 :(得分:0)
您可能会选择SelectMany ...
IList<string> emails = personsRepository
.Query()
.SelectMany(x => x.Emails.Select(e => e.Email))
.ToList();
IList<string> phoneNumbers = personsRepository
.Query()
.SelectMany(x => x.Phones.Select(e => e.Number))
.ToList();
编辑:好的...。那么简单...
var personEmails = personsRepository
.Query()
.Select(x => new PersonDto
{
Name = x.Name,
Emails = x.Emails.Select(y => y.Email),
}).ToList();
var personPhones = personsRepository
.Query()
.Select(x => new PersonDto
{
Name = x.Name,
Phones = x.Phones.Select(y => y.Number),
}).ToList();
这将导致两个查询。第一个在“个人和电子邮件”表上联接,第二个在“个人和电话”表上联接。与您第一次尝试在单个查询中对“人”,“电子邮件”和“电话”表进行联接的尝试相比。
如果您想知道是否有一种方法可以指示EF将单个LINQ查询分解为多个SQL查询,那么我会说没有办法。