sql转linq
1. LINQ比一般的sql语句效率更高吗
Linq是一个范围比较大的概念,它其中不单单只有linq to sql,还有相应的linq to xml等等。所以拿linq 与SQL语句相比,没有可比性的。
但如果拿linq to sql相比的话,与SQL还是有很大的可比性的。一般情况下,你必须要明白你所指的效率是哪一方面?是数据库执行效率?还是整体成品软件运行效率?还是开发效率?
开发效率上linq to sql显然要比SQL的效率要高很多,我们使用linq to sql 可以很容易实现编程,其中的代码量也大大减少。所以如果从开发方面linq to sql的效率是毫无疑问要高于直接的SQL与数据库连接。
如果从编方译考虑,这个一般情况下,linq to sql是引入的新的技术,效率肯定是不如SQL的。好在这个编译的部分不需要开发人员或是任何用户的参与,所以即是效率差一点,对软件来说没有任何的影响。
最后一部分你可以比较感兴趣,谁对数据库的连接更快,执行效率更好?答案是linq to sql而不是直接的语句。一般我们使用直接的语句要求的是即是的执行,但事实上很多时间我们根本不需要那么多,linq to sql其实说明了就是会自动生成与表结构同样的一些对象。而这些对象在联系数据库时也是直接编译好的语句,直接联系时,两者效率是相同的。
但是,如果我们对数据进行处理时,你就会发现,linq to sql的效率为什么会更高了!因为他在读取时不但会读取当前表来填充生成的对象,同时还是延时读其相关表,为你使用有关系的表提供了极大的方便。那么你的相关表的读取效率要快了!
但不管怎么样,他们都是在站立在了ado.net的基础之上的,只不过有些自动生成了,根本不需要你再去做而已。唯一效果比较差的是,linq to sql读出的数据在系统中被转化了,同时它效率虽然变差一些,但是却带来了另一个好处,就是我们常说的SQL注入问题不再出现,你所输入的任何东西都会变成了字符串了。
其实ADO.net的方案中我们使用了datareader方案的效高是比较高的,但是对于更新却是极差的。而使用数据适配器的方案效率较底一些,更对于数据的更新是相当好的,而对于linq to sql其实它是使用数据缓存方案,也就是说linq to sql其实将数据库中的数据缓存到了对象中,如果对象发生了更改,有必须过行返馈时,它是可以进行反馈的,而是这种反馈是可控制的,事务性的。从各方面给我们带来了好处。
我们可以在更新了很多内容之后再去提交更改,那么这种效率论从理解上还是效率上都优化你的原来的语句的!所以linq to sql并非在性能上的降低,而是一种提高。
严格说来,linq to sql并不是节省了代码,相反它增加了很多代码,便幸运的是,这些代码都是由linq to sql框架自动生成的。若是换作人工,容易出错的。但在使用时,由于框架完成了大部分的代码,我们再使用linq to sql加上lambad表达式或查询表达式,我们的代码就变得极少且极简洁了!而如果使用lambad表达式或查询表达式时,它的效率显然不如直接SQL来的直接。读取效率会变得差一些的!
这是因为lambda表达式或查询表达式是一个动态编译的效果,而不是直接编译好的,他要对语句进行编译与优化以何证效率,但性能上因为多了一重处理,效率没有SQL来的直接。但一般情况下,使用linq to sql配合查询表达式或lambad表达式时,效率虽然稍差,但是带来的却是代码的简洁与易理解性,如果不配合查询表达式与lambad表达式,linq to sql的优劣还不利用体现。所以关非linq to sql的效率差,而是我们使用了查询表达式的动态编译导致了效率较差。就linq to sql本身上来就,效率并不差的!
2. SQL语句转化为Linq语句
分少点!回头帮我的团队打工偿还吧!O(∩_∩)O哈哈~
-------------
我的表是Table_1s和Table_2s
linq 查询如下:
from t in Table_1s
join f in Table_2s on t.B equals f.Key into FD
from f in FD.Where(b=>b.RowName=="B").DefaultIfEmpty()
join s in Table_2s on t.C equals s.Key into FDS
from s in FDS.Where(b=>b.RowName=="C").DefaultIfEmpty()
select new
{
A=t.A,
B=f.Value,
C=s.Value
}
---
对应sql如下:
-- Region Parameters
DECLARE @p0 NVarChar(1) SET @p0 = 'B'
DECLARE @p1 NVarChar(1) SET @p1 = 'C'
-- EndRegion
SELECT [t0].[A], [t1].[value] AS [B], [t2].[value] AS [C]
FROM [Table_1] AS [t0]
LEFT OUTER JOIN [Table_2] AS [t1] ON ([t1].[RowName] = @p0) AND ([t0].[B] = [t1].[key])
LEFT OUTER JOIN [Table_2] AS [t2] ON ([t2].[RowName] = @p1) AND ([t0].[C] = [t2].[key])
---
应该满足你的要求!
3. 请问一下SQL中的CASE When 在Linq中应该如何去使用
三四项简单的处理可以用三目表达式直接写;
四项以上或者有复杂的处理最好就使用外接函数或者自定义数据库函数或者数据库存储过程了。
4. linq to sql 通用查询语法 return db.Set<T>().Where<T>(wherelambda).AsQueryable();
Linq是延迟查询的。
测试(以下查询,查询分析器中跟踪是带where条件的):
privatevoidButton_Click(objectsender,RoutedEventArgse)
{
List<v_plancase>list=GetData(p=>p.xh==1).ToList();
}
///<summary>
///查询
///</summary>
///<paramname="ExpWhere">查询条件</param>
///<returns></returns>
staticIQueryable<v_plancase>GetData(Expression<Func<v_plancase,bool>>ExpWhere)
{
TESTEntitiesdb=newTESTEntities();
returndb.v_plancase.Where(ExpWhere).AsQueryable();
}
详细介绍:
在用户创建 LINQ 查询后,该查询将转换为一个命令目录树。 命令目录树是与实体框架兼容的查询表示形式。 然后,针对数据源执行该命令目录树。 在执行查询时,将计算所有查询表达式(即查询的所有组成部分),包括在结果具体化中使用的那些表达式。
执行查询表达式的时间点可能会有所不同。 LINQ 查询始终在循环访问查询变量时执行,而不是在创建查询变量时执行。 这称为“延迟执行”。 您也可以强制立即执行查询,这对于缓存查询结果很有用。
当执行 LINQ to Entities 查询时,查询中的有些表达式可能在服务器上执行,而有些部分可能在客户端上本地执行。 表达式的客户端计算发生于在服务器上执行查询之前。 如果在客户端上计算表达式,则该计算的结果将替换查询中的表达式,然后在服务器上执行查询。 因为是对数据源执行查询,所以数据源配置将重写客户端中指定的行为。 例如,null 值处理和数值精度取决于服务器设置。 在查询执行期间在服务器上引发的任何异常都将直接向上传递到客户端。
参考MSDN文档:http://msdn.microsoft.com/zh-cn/library/vstudio/bb738633(v=vs.100).aspx
5. 有没有直接把sql语句转换成linq的,或者反转的工具
Linq pad 红书
可以把linq转成sql,或者SQL Server Profiler抓取执行的sql语句
6. c# LINq实现SQL
varresult=fromarrinsite_jwserver
grouparrbyarr.s_ipintog
selectnew
{
cont=g.Count(),
s_ip=g.Key
};
foreach(varvinresult)
//v.cont
//v.s_ip