Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架中的拆分数据库选择执行_C#_Entity Framework - Fatal编程技术网

C# 实体框架中的拆分数据库选择执行

C# 实体框架中的拆分数据库选择执行,c#,entity-framework,C#,Entity Framework,这段代码可以工作,但我希望有一个单独的SQL执行来选择电话并链接到相应的人。我该怎么做 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)

这段代码可以工作,但我希望有一个单独的SQL执行来选择电话并链接到相应的人。我该怎么做

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();
使用Include below works-执行两个SQL查询,一个用于个人电子邮件连接,另一个用于个人电话,最终个人拥有一个带有电子邮件和电话的个人列表。但我想限制我所需字段的选择(即电子邮件和号码)。这就是为什么我喜欢像上面的代码那样使用Select(投影)

var persons = personsRepository.Query()
    .Include(x => x.Emails)
    .ToList();

persons = personsRepository.Query()
    .Include(x => x.Phones)
    .ToList();

为简洁起见,我省略了其他6个必须包含/加入到person中的实体。

您可能在选择了许多之后

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();
这将导致两个查询。第一个是Person和Email表上的连接,第二个是Person和Phone上的连接。与第一次尝试在单个查询中连接Person、Email和Phone表相比


如果您想知道是否有一种方法可以指示EF将一个LINQ查询分解为多个SQL查询,我会说没有方法可以这样做。

再次使用
选择
(投影)为什么要单独执行SQL?作为一个SQL操作,它肯定会更快吗?@TheGeneral,这就是我在第一个代码段中所做的。@Mick,我提到过,还有6个实体需要连接到person。将其中7个连接到另一个人身上,效果很差。因此,我想尝试将单一查询拆分为2或3个查询。
personRepo.query().Include(x=>x.Phones)。Select(x=>x.Phones.XXX)。ToList()
这不能解决问题吗?这会导致人们拥有一个字符串(数字)列表。第一个查询中的电子邮件列表被电话查询覆盖。@ERM它是您自己代码的派生。我已经更新了答案,这样这些值就不会被“覆盖”谢谢@Mick,我的代码会返回一个所有人的列表,上面都附有电子邮件和电话。电话查询不会覆盖电子邮件查询(由于EF关系修复)。您的代码返回两个单独的电子邮件和电话列表。@ERM您的问题或评论不清楚您想做什么……谢谢@Mick,我更新了问题。我希望现在更清楚了。
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();