问一个Linq性能问题

问题描述

如下两个表,都有数据[Table("Users")]publicclassUsers{publicUsers(){this.UserSources=newHashSet<UserScore>();}[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]publicintUserId{get;set;}publicstringName{get;set;}publicstringEmail{get;set;}publicvirtualICollection<UserScore>UserSources{get;set;}}[Table("UserScore")]publicclassUserScore{publicintId{get;set;}publicintUserId{get;set;}publicintScore{get;set;}}

请问哪一种方式性能更高方式1foreach(varuserincontext.User.ToList()){foreach(variteminuser.UserSources){Console.WriteLine(item.Score);}}

方式2varquery=(fromuincontext.Userjoinsincontext.UserScoreonu.UserIdequalss.UserIdselectnew{UserId=u.UserId,Score=s.Score}).ToList();foreach(varuserinquery){Console.WriteLine(user.Score);}

解决方案

解决方案二:
第一种,因为第一种没创建额外的匿名类,也没进行额外的join
解决方案三:
引用1楼starfd的回复:

第一种,因为第一种没创建额外的匿名类,也没进行额外的join

但我发现他每次都会去查数据库
解决方案四:
你这个是主外键……
解决方案五:
如果是这种主外键查询的话,那应该是第二种效率高,因为它只查一次
解决方案六:
引用3楼starfd的回复:

你这个是主外键……

我看好多用EF的,一般都会用一个virsual作为导航属性
解决方案七:
匿名类(委托)都是编译时就创建好了,跟性能没关系。但是不同类中相同的匿名类可能会冗余,因此可能会使程序集元数据增大,导致加载时占的内存更大如果是数据库中的数据,当然是第二种,第一种会将两个表中的所有数据全部取出来(表扫描),第二种则是将Linq翻译成sqljoin语句去数据库查询,数据库会自动选择最效率的方案查询(比如会优先使用键/索引),返回最后的结果集,很明显这个结果集是两个表数据的子集如果是内存数据,则两种差不多,Linq会稍慢(几乎可以忽略)
解决方案八:
也就是说查数据库还是建议用第二种方式,特别是在遍历一个实体又要取他的导航属性里的其他字段,是这样理解吧
解决方案九:
是的,因为让数据库返回一整个表的数据,负担是比较重的,反倒是把数据库最优秀的查询效率给避开了,它设计的那么多的键/索引以及各种高效稳定的查询算法,你都没用上。关系库最擅长的就是关联(系)查询,就像你上面要查导航属性一样

时间: 2024-09-28 10:27:20

问一个Linq性能问题的相关文章

借人气 问一个linq 问题

问题描述 returndc.Content.Where(c=>c.Status==status&&c.AuditList.Split(',').Contains(user.id.ToString()))报错类型"System.String[]"不支持比较运算符.换成return(fromcindc.GetTable<Content>()letautlist=c.AuditList.Split(',')fromtempinautlistwherec.St

问一个关于性能的问题,欢迎进来讨论一下

问题描述 情况是这样的,现在假如我在数据库的一个表里面,有1000记录.我现在要在客户端用ajax随机的读这个表的一条数据,并在我的主页上显示出来,3秒一换.这样的话,我的数据库承受的压力就比较大了,如果一万个用户访问我的主页的话,他们就算是不点页面,总共也是以3秒一万次的速度访问我的数据库.有一个解决办法就是,把这一千条记录生成为文本文件,然后我在服务器就不直接访问数据库了,每次随机读其中的文本文件.我对缓存之类的不熟悉,或许可以通过缓存来解决这个问题,麻烦大家指导一下,或者推荐一些这方面的文

LINQ性能分析系列之传说中的LINQ

话说自从 Beta1 发布以来,关于 .Net Framework 3.5 的讨论真是沸沸扬扬.我大概也算是比较早吃螃蟹的一位,Beta1 发布伊始就将它用于正式的开发中.虽然其间遇到过许许多多的 BUG,对于 .Net Framework 3.5 的核心特性 - LINQ,我个人感觉还是相当满意的.然而仅仅是 LINQ 比较酷的语法,绝不足以决定项目所用的技术.事实上,如果不是我这种个人作坊式的开发,评估新技术是否采用很重要的一点,就是它的性能是否令人满意.如果您还不了解 LINQ,可以通过简

代码-问一个JAVA的基础问题,希望大神们帮忙解惑。

问题描述 问一个JAVA的基础问题,希望大神们帮忙解惑. 有一段如下的代码,有几个疑惑: 1.定义了一个final的test1和一个static里面的test1,为什么定义2个test1不会有问题? 2.为什么在一个类中直接写static{ },这个是什么原理? 3.还有什么类似static{ }这样的写法?是什么原理? public class MyOwenTest{ public static final String test1 = "a"; static{ String tes

我想问一个问题 在azure 用Windows虚拟机搭建VPN 最大支持多少并发量

问题描述 我想问一个问题 在azure 用Windows虚拟机搭建VPN 最大支持多少并发量 我想问一个问题 在azure 用Windows虚拟机搭建VPN 最大支持多少并发量 如果点到站点的是多少? 站点到站点的是多少? 解决方案 azure和windows server都没有限制.但是根据用户负载,过多的连接实际上已经过慢而变得不可用. 经验值是,如果你是A1实例的虚拟机,支持一般的网页浏览和移动终端使用,大约可以支持10个用户. 解决方案二: 取决于你的机器的性能,你申请的资源 解决方案三

对象-JAVA 菜鸟 问一个菜鸟问题 list 的排序问题

问题描述 JAVA 菜鸟 问一个菜鸟问题 list 的排序问题 简化一下 list 情况 比如 一个 student 类 只有两个参数 学号 sno 和 成绩 grade 现全放入 ArrayList中 如何按成绩 将 学生对象排序 实现目标如下即可 002 97 003 95 001 90 求各位路过大神 不吝指教后生 解决方案 先自己定义一个对比的方法类 class MyIntComparator implements Comparator{ public int compare(Objec

java-新手问一个很奇怪的问题

问题描述 新手问一个很奇怪的问题 class Demo { int num = 1; int add = 2; Demo() { num = 5; add = 6; } void show() { System.out.println("Fu num="+num+" Fu add="+add); } } class DemoA extends Demo { DemoA() { this.num = 3; this.add = 4; } void show() { S

逻辑训练-问一个逻辑问题,关于离散数学的

问题描述 问一个逻辑问题,关于离散数学的 本人信息安全专业最近学到离散数学讲到一个蕴含关系想问问大家一个思维问题就图里画线部分.p 蕴含q 在日常生活中可以变成类似于只有 q才 p 这个要怎么理解它?利用集合来理解可以吗 解决方案 离散数学不太清楚了,就理解的话,应该可以使用集合来理解,p蕴含q,说明q是p的组成要素,如人是由各种器官组成的,比如心脏,只有心脏存在,才能存在人.也就是说q是p的必要不充分条件. 解决方案二: 离散数学不太清楚了,就理解的话,应该可以使用集合来理解,p蕴含q,说明q

代码-问一个win32application中,我创建了对话框,

问题描述 问一个win32application中,我创建了对话框, 在对话框中我拖进去编辑框控件,问题是如何使用编辑框,得到输进去的数字求求各位高手了,最好有具体代码,感激不尽!!! 解决方案 用GetDlgItem获取编辑框窗口句柄,用GetWindowText获取编辑框内容,用atoi等函数将字符串转换成整数或者用 GetDlgItemInt 解决方案二: 直接用GetDlgItemInt就可以了.不需要什么"G?e?t?DlgItem获取到控件,然后GetWindowText获取控件文本