在Entity Framework中拆分数据库选择执行

时间:2018-09-11 01:56:54

标签: c# entity-framework

此代码有效,但是我希望有一个单独的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个实体。

1 个答案:

答案 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查询,那么我会说没有办法。