构造复杂Lambda困惑之学会用LinqPad和Linqer实现Sql 和 Lambda之间的互转

Posted dragon.net

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构造复杂Lambda困惑之学会用LinqPad和Linqer实现Sql 和 Lambda之间的互转相关的知识,希望对你有一定的参考价值。

一:linq的话我们可能会遇到两个问题:

1. 我们的linq出现性能低下的时候,如果优化????

我们写的linq所生成的sql是无法控制的。。。 (要做性能优化,必须预先知道sql会生成啥样的???)

sql profile 查看生成的sql。。。


这个时候,我们必须有一个工具知道linq转成的sql会是啥样的???

linq =》 sql


《1》 LinqPad

先linq转换成sql,,,这样的话就方便我们做优化了。。。

在分页的时候,我们的sql会变成相当复杂。。。


官方下载地址: https://www.linqpad.net/Download.aspx


Teachers.GroupJoin(Courses, (Teacher t) => t.TeacherId,
(Course c) => c.TearcherId,
(t, list) => new
{
t.TeacherName,
list
}).Skip(1).Take(2)


-- Region Parameters
DECLARE @p0 Int = 1
DECLARE @p1 Int = 2
-- EndRegion
SELECT [t1].[TeacherName], [t2].[CourseId], [t2].[CourseName], [t2].[Location], [t2].[TearcherId], (
SELECT COUNT(*)
FROM (
SELECT NULL AS [EMPTY]
FROM [Course] AS [t3]
WHERE ([t1].[TeacherId]) = [t3].[TearcherId]
) AS [t4]
) AS [value]
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY [t0].[TeacherId]) AS [ROW_NUMBER], [t0].[TeacherName], [t0].[TeacherId]
FROM [Teacher] AS [t0]
) AS [t1]
LEFT OUTER JOIN [Course] AS [t2] ON ([t1].[TeacherId]) = [t2].[TearcherId]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER], [t2].[CourseId]


用到了 ROW_NUMBER() 函数。。。。

这样的话,我们就可以做性能优化。。。。【评估执行计划】


这个时候,如果sql非常慢,我们可以通过“加索引”的方式加速查询性能。。。


2. 有时候业务非常复杂,linq需要嵌套加嵌套,crm,erp,oa。。。【报表统计】

linq复杂的情况下,我们不知道如何构造。。。。这就尴尬了。。。

这个时候我们知道sql的写法。。。

sql =》 linq

Linqer 工具。。。。


官方下载地址: http://www.sqltolinq.com/downloads

sql:

select * from Teacher as t
join Course as c
on t.TeacherID=c.TearcherId
where t.TeacherId>2 and UPPER(t.TeacherName)=‘葛老师‘ and c.CourseName like ‘%历%‘
order by c.Location


linq:

from c in db.Course
where
c.Teacher.TeacherId > 2 &&
c.Teacher.TeacherName.ToUpper() == "葛老师" &&
c.CourseName.Contains("历")
orderby
c.Location
select new {
CourseId = c.CourseId,
CourseName = c.CourseName,
Location = c.Location,
TearcherId = c.TearcherId,
TeacherId = c.Teacher.TeacherId,
TeacherName = c.Teacher.TeacherName,
TeacherType = c.Teacher.TeacherType
}

 






















































以上是关于构造复杂Lambda困惑之学会用LinqPad和Linqer实现Sql 和 Lambda之间的互转的主要内容,如果未能解决你的问题,请参考以下文章

基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇二》已开源

LINQPad

JDK8新特性之方法引用

Java之线程池和Lambda表达式

java8之lambda表达式

设计模式之构造者模式