问一个Linq性能问题

叫我 Teacher 周 2015-09-08 12:44:26
如下两个表,都有数据

   [Table("Users")]
public class Users
{
public Users()
{
this.UserSources = new HashSet<UserScore>();
}

[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string Name { get; set; }
public string Email { get; set; }

public virtual ICollection<UserScore> UserSources { get; set; }
}

[Table("UserScore")]
public class UserScore
{
public int Id { get; set; }
public int UserId { get; set; }
public int Score { get; set; }
}



请问哪一种方式性能更高

方式1
 foreach (var user in context.User.ToList())
{
foreach (var item in user.UserSources)
{
Console.WriteLine(item.Score);
}
}


方式2
var query = (from u in context.User
join s in context.UserScore on u.UserId equals s.UserId
select new
{
UserId = u.UserId,
Score = s.Score
}
).ToList();


foreach (var user in query)
{
Console.WriteLine(user.Score);
}
...全文
480 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
是的,因为让数据库返回一整个表的数据,负担是比较重的,反倒是把数据库最优秀的查询效率给避开了,它设计的那么多的键/索引以及各种高效稳定的查询算法,你都没用上。 关系库最擅长的就是关联(系)查询,就像你上面要查导航属性一样
  • 打赏
  • 举报
回复
第一种,因为第一种没创建额外的匿名类,也没进行额外的join
叫我 Teacher 周 2015-09-08
  • 打赏
  • 举报
回复
也就是说 查数据库还是建议用第二种方式,特别是在遍历一个实体又要取他的导航属性里的其他字段,是这样理解吧
  • 打赏
  • 举报
回复
匿名类(委托)都是编译时就创建好了,跟性能没关系。但是不同类中相同的匿名类可能会冗余,因此可能会使程序集元数据增大,导致加载时占的内存更大 如果是数据库中的数据,当然是第二种,第一种会将两个表中的所有数据全部取出来(表扫描),第二种则是将Linq翻译成sql join语句去数据库查询,数据库会自动选择最效率的方案查询(比如会优先使用键/索引),返回最后的结果集,很明显这个结果集是两个表数据的子集 如果是内存数据,则两种差不多,Linq会稍慢(几乎可以忽略)
叫我 Teacher 周 2015-09-08
  • 打赏
  • 举报
回复
引用 3 楼 starfd 的回复:
你这个是主外键……
我看好多用EF的,一般都会用一个virsual作为导航属性
  • 打赏
  • 举报
回复
如果是这种主外键查询的话,那应该是第二种效率高,因为它只查一次
  • 打赏
  • 举报
回复
你这个是主外键……
叫我 Teacher 周 2015-09-08
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
第一种,因为第一种没创建额外的匿名类,也没进行额外的join
但我发现他每次都会去查数据库

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧