Linq to Sql中Single写法不当可能引起的数据库查询性能低下

场景:需要从T_User表中返回指字条件的某条记录的某一个字段

在Linq中有二种理论上都行得通的写法,见下面的代码:

Code
using (dbUserDataContext db = new dbUserDataContext(Website.ConnStrdbUser))
            {
                try { 
                    //Guid _UserId = db.T_User.Single(c=>c.F_ID==new Guid("00000000-0000-0000-0000-000000000001")).F_ID;
                    //最终提交到数据库的语句是
//                    exec sp_executesql N'SELECT [t0].[F_ID], [t0].[F_No], [t0].[F_NickName], [t0].[F_Title], [t0].[F_Sex], [t0].[F_Birthday], ...FROM [dbo].[T_User] AS [t0] WHERE [t0].[F_ID] = @p0',N'@p0 uniqueidentifier',@p0='00000000-0000-0000-0000-000000000001'
                    //即先把整条记录的所有字段全部取出,转化成T_User对象后,再将T_User.F_ID赋值给_UserId

                    Guid _UserId = db.T_User.Where(c => c.F_ID == new Guid("00000000-0000-0000-0000-000000000001")).Select(c => c.F_ID).Single();
                    //最终提交到数据库的语句是
//                    exec sp_executesql N'SELECT [t0].[F_ID]
//FROM [dbo].[T_User] AS [t0]
//WHERE [t0].[F_ID] = @p0',N'@p0 uniqueidentifier',@p0='00000000-0000-0000-0000-000000000001'
                    //这才是我们想要的语句,即仅查询一个字段
                }
                catch { }
                finally { db.Connection.Close();//这一行纯属个人习惯,不必强求 }

 

初看上去
Guid _UserId = db.T_User.Single(c=>c.F_ID==new Guid("00000000-0000-0000-0000-000000000001")).F_ID;
这种写法似乎要比下面的写法省事得多
Guid _UserId = db.T_User.Where(c => c.F_ID == new Guid("00000000-0000-0000-0000-000000000001")).Select(c => c.F_ID).Single();
但观察最终提交到sqlserver的语句发现,第一种写法生成的语句返回了大量我们并不需要的字段,其实理解起来,也应该是这样的,先Single出一个对象后,再取其中一个属性,可不就是这样么!

前几天,看到园子里有N多人说Linq如何如何差,甚至说linq要淘汰之类,感到很滑稽,技术本身并无问题,看你怎么用了,vb也能弄出很不错的系统,就象本文所提的内容,对linq有成见的人,可能会说:"linq真烂,这么不智能,很傻很天真";而真正用linq的人,也许会说:"原来如此,以后我们应该用正确的写法,以避免因疏忽导致的性能问题"--生活很美好,快乐自己找,关键在于用什么角度去看,呵呵

时间: 2024-09-19 09:09:31

Linq to Sql中Single写法不当可能引起的数据库查询性能低下的相关文章

在Linq to Sql中管理并发更新时的冲突(3):使用记录的时间戳

在<在Linq to Sql中管理并发更新时的冲突(2):引发更新冲突>一文中 ,我们描述了Linq to Sql检测在更新时是否产生了冲突的基本方法:将该记录 每个字段原来的值和更新时的值进行对比,如果稍有不同则意味着记录被修改过 ,因此产生了更新冲突.不过您是否有这样的感觉,这种方法实在累赘了一些? 如果一个表中有数十个字段,那么更新就必须完整地检测一遍(不过我会在今后 的文章中提到这方面的控制).再者,如果其中某一个字段储存了洋洋洒洒上万 字的文章,那么在验证时仅仅是将它从Web服务器发

LINQ TO SQL中还是用传统的连接串方式建立DbContext更好些

    首先,在LINQTOSQL中可以这样建立一个dbcontext     private TEntity GetOriginal(TEntity entity)        {            using (Entity.EEE114.LinqEEE114DataContext context = new Entity.EEE114.LinqEEE114DataContext())            {                var table = context.Ge

在LINQ to SQL中使用Translate方法以及修改查询用SQL

目前LINQ to SQL的资料不多--老赵的意思是,目前能找到的资 料都难以摆脱"官方用法"的"阴影".LINQ to SQL最 权威的资料自然是MSDN,但是MSDN中的文档说明和实例总是显得"大开大 阖",依旧有清晰的"官方"烙印--这简直是一 定的.不过从按照过往的经验,在某些时候如果不按照微软划定的道道来走,可 能就会发现别样的风景.老赵在最近的项目中使用了LINQ to SQL作为数据层的基础,在LINQ to S

Linq to SQL中的实体继承

现在的Linq To Sql只支持单表继承,不支持一实体一具体表和一实体一扩展表等方式继承.什么是单 表继承呢?所谓单表继承就是把整个继承体系存储在数据库的一个表中.由此可以知道,这个表结构包括 所有实体的属性字段,如果在该继承体系中,实体的数量较多,就会产生大量的null值的数据,这样浪费 了很多的数据存储空间.不过所有的继承体系放在一个表中,逻辑简单容易操作,数据量不大的时候效率 也高.下面看看在Linq To Sql中是怎样实现单表继承的(用Orcas白皮书中的示例来说明). 假如现在有这

[转]Linq to SQL中的实体继承

原文:http://www.cnblogs.com/blusehuang/archive/2007/07/05/807027.html    现在的Linq To Sql只支持单表继承,不支持一实体一具体表和一实体一扩展表等方式继承.什么是单表继承呢?所谓单表继承就是把整个继承体系存储在数据库的一个表中.由此可以知道,这个表结构包括所有实体的属性字段,如果在该继承体系中,实体的数量较多,就会产生大量的null值的数据,这样浪费了很多的数据存储空间.不过所有的继承体系放在一个表中,逻辑简单容易操作

linq to sql中的自动缓存(对象跟踪)

这篇东西应该至少一年前就写的,不过因为个人太懒,一直没记下来,今天补上.   linq to sql中,对于同一个DataContext上下文环境,根据表主键选择记录时(当然这里所指的"记录"会自动转成"对象"),如果该记录已经被select过,默认情况下会被自动缓存下来,下次再选择时,将自动返回已缓存的对象,而不是重新从数据库里查询.   在很多情况下(特别是查询的场景),这会提高性能(因为避免了数据库重复查询),但是也时候也会带来麻烦:   比如我们取出一个对象

php-ajax 从页面中获取元素传递给PHP 进行数据库查询的问题

问题描述 ajax 从页面中获取元素传递给PHP 进行数据库查询的问题 ajax从界面中获取id为username的文本内容"张三" $.ajax({ type:"POST", url:"getallleads.php", data:"account="+$("#username").text(), success:function(data){showalllead(data);} }) PHP中接收,并

linq to sql 中,如何解决多条件查询问题,答案,用表达式树! (下)_实用技巧

如何从真正意义上做到延迟加载,即一次只从数据库中取我们需要的用到的那部分数据呢.通过研究,有了下面的方法: 首先,我们要新建一个静态类,用于存放多条件组合查询的各种组合,比如or,And这些等等.代码如下: 复制代码 代码如下: using System.Linq.Expressions; public static class PredicateExtensionses { public static Expression<Func<T, bool>> True<T>

在Linq to Sql中管理并发更新时的冲突(2) 引发更新冲突

在上一讲中,我们提到了一些诸如"乐观并发控制"."悲 观并发控制"的概念,以及察看Linq to Sql自动生成sql语句的方法.从 这篇文章起我们将继续来查看Linq to Sql在管理并发更新时是如何发现冲突问 题的. 要使用Linq to Sql,我们自然需要一个数据库环境.为了说明问 题,我们这里使用一个非常简单的数据表. 我们这里创建了一个Video表,只有3个字段,没有约束,没有外键 --我们只要能够说明问题就可以了,不是吗? VideoID:主 键,i