Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.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#_Linq To Sql_Entity Framework 6 - Fatal编程技术网

C# 如何以最有效的方式从多个表中选择数据?

C# 如何以最有效的方式从多个表中选择数据?,c#,linq-to-sql,entity-framework-6,C#,Linq To Sql,Entity Framework 6,我已经编写了两个Linq-to-sql查询,但我不喜欢这样一个事实,即我必须循环第一个查询才能运行第二个查询 第二个表上有一个外键,它引用了第一个表Id。有人能改进我编写的代码吗?或者这是理想的解决方案吗 using (var entities = new dbEntities()) { var groups = (from g in entities.ObjectGroup select g); var mappings = (Auto

我已经编写了两个Linq-to-sql查询,但我不喜欢这样一个事实,即我必须循环第一个查询才能运行第二个查询

第二个表上有一个外键,它引用了第一个表Id。有人能改进我编写的代码吗?或者这是理想的解决方案吗

using (var entities = new dbEntities())
{
    var groups = (from g in entities.ObjectGroup
                    select g);

    var mappings = (AutoMapper.Mapper.Map<IEnumerable<ObjectGroupModel>>(groups));

    foreach (var map in mappings) 
    {
        var types = (from t in entities.ObjectTypeToObjectGroupMappings
                        where t.ObjectGroupId == map.Id
                        select t.ObjectTypeId);
        map.ObjectTypeIds = types;
    }

    return mappings;
}
使用(var entities=new dbEntities())
{
变量组=(来自entities.ObjectGroup中的g)
选择g);
var映射=(AutoMapper.Mapper.Map(组));
foreach(映射中的var映射)
{
变量类型=(来自entities.ObjectTypeToObjectGroupMappings中的t)
其中t.ObjectGroupId==map.Id
选择t.ObjectTypeId);
map.ObjectTypeIds=类型;
}
返回映射;
}

感谢您的帮助。

您可以尝试以下方法:

var mappings = (from gr in entities.ObjectGroup
                join t in entities.ObjectTypeToObjectGroupMappings
                on gr.Id equals t.ObjectGroupId into subTs
                from subT in subTs.DefaultIfEmpty()
                group new { gr, subT } by new { gr.Id /*and other gr's properties*/} into sub
                select new ObjectGroupModel 
                {
                     Id = sub.Key.Id,
                     /*other gr's properties via propN = sub.Key.propN*/
                     ObjectTypeIds = sub.Where(x => x.subT != null).Select(x => x.subT.ObjectTypeId).ToList()
                }).ToList();

您可以尝试以下方法:

var mappings = (from gr in entities.ObjectGroup
                join t in entities.ObjectTypeToObjectGroupMappings
                on gr.Id equals t.ObjectGroupId into subTs
                from subT in subTs.DefaultIfEmpty()
                group new { gr, subT } by new { gr.Id /*and other gr's properties*/} into sub
                select new ObjectGroupModel 
                {
                     Id = sub.Key.Id,
                     /*other gr's properties via propN = sub.Key.propN*/
                     ObjectTypeIds = sub.Where(x => x.subT != null).Select(x => x.subT.ObjectTypeId).ToList()
                }).ToList();

硬编码联接与ORM中的高效联接相反。“这是一个非常强烈的信号,表明重要关系正在消失。”“PanagiotisKanavos,你的评论与问题有关,而不是与我的答案有关。它与答案有关。”。这样的代码不应该用于生产这只是对现有问题的回答,硬编码联接是生产中nöt显式相关表的常用方法,以避免在延迟加载情况下频繁和分离的子查询。硬编码联接与ORM中的高效相反。“这是一个非常强烈的信号,表明重要关系正在消失。”“PanagiotisKanavos,你的评论与问题有关,而不是与我的答案有关。它与答案有关。”。这样的代码不应该在生产中使用这只是对现有问题的回答,硬编码联接是生产中nöt显式相关表的常用方法,以避免在延迟加载时频繁和分离的子查询。您的实体应该具有连接它们的关系。如果他们这样做了,您所要做的就是加载根对象,相关的对象将被延迟或急切地加载。例如,
ObjectTypeToObjectGroupMapping
应该有一个
ObjectGroup
属性,而不是需要手动加入的ObjectGroupId。
ObjectGroup
应该有一个
ObjectTypes
集合,该集合将按自身加载所有相关类型。您的实体应该有连接它们的关系。如果他们这样做了,您所要做的就是加载根对象,相关的对象将被延迟或急切地加载。例如,
ObjectTypeToObjectGroupMapping
应该有一个
ObjectGroup
属性,而不是需要手动加入的ObjectGroupId。
ObjectGroup
应该有一个
ObjectTypes
集合,该集合将自己加载所有相关类型