C# 如何以最有效的方式从多个表中选择数据?
我已经编写了两个Linq-to-sql查询,但我不喜欢这样一个事实,即我必须循环第一个查询才能运行第二个查询 第二个表上有一个外键,它引用了第一个表Id。有人能改进我编写的代码吗?或者这是理想的解决方案吗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
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
集合,该集合将自己加载所有相关类型