请问这个长长的SQL查询语句能转换为LINQ吗?
下面是原来的SQL语句。前面的可以不用太理会,主要是最后一个left join,连接了一个临时表([故障记录表]和[故障处理表]是一对多的关系,由于一条记录对应多条处理结果,而只需要查出最后处理的一条记录,所以用了max(a.[处理时间]))。
SELECT [故障记录表].[序号]
,[故障记录表].[分类]
,[终端信息表].[品牌]
,[网点信息表].[隶属支行]
,[网点信息表].[网点名] as 网点
,[用户信息表].[用户名] as 登记人
,[故障记录表].[标签号]
,[故障分类]
,[故障描述]
,[登记时间]
,[最后处理时间]
,[故障记录表].[处理标志]
FROM [故障记录表]
left join [网点信息表] on [故障记录表].[网点号] = [网点信息表].[网点号]
left join [用户信息表] on [故障记录表].[登记人] = [用户信息表].[登录ID]
left join [终端信息表] on [故障记录表].[标签号] = [终端信息表].[标签号]
left join
(
select a.[故障编号]
,a.[处理标志]
,max(a.[处理时间]) as [最后处理时间]
from [故障处理表] as a,(SELECT distinct [故障编号],[处理标志] FROM [TML].[dbo].[故障处理表]) as b
where a.[故障编号]=b.[故障编号] and a.[处理标志]=b.[处理标志]
group by a.[故障编号],a.[处理标志]
) as table1 on [故障记录表].[序号] = table1.[故障编号] and [故障记录表].[处理标志] = table1.[处理标志]
下面是我尝试转换成的LINQ:
var temp1 = (from p in this.context.故障处理表
select new { p.故障编号, p.处理标志 }).Distinct();
var temp2 = from p in this.context.故障处理表
join o in temp1
on new { p.故障编号, p.处理标志 } equals new { o.故障编号, o.处理标志 }
select new { p.故障编号, p.处理标志, p.处理时间 };
var temp3 = from p in temp2
group p by new { p.故障编号, p.处理标志 } into g
select new { g.Key.故障编号, g.Key.处理标志, 最后处理时间 = g.Max(p => p.处理时间) };
var result = from p in this.context.故障记录表
join o1 in this.context.网点信息表 on p.网点号 equals o1.网点号 into gj1
join o2 in this.context.用户信息表 on p.登记人 equals o2.登录ID into gj2
join o3 in this.context.终端信息表 on p.标签号 equals o3.标签号 into gj3
join o4 in temp3 on new {p.序号, p.处理标志} equals new {o4.故障编号, o4.处理标志} into gj4
from g1 in gj1.DefaultIfEmpty()
from g2 in gj2.DefaultIfEmpty()
from g3 in gj3.DefaultIfEmpty()
from g4 in gj4.DefaultIfEmpty()
select new
{
p.序号,
p.分类,
p.标签号,
p.故障分类,
p.故障描述,
p.登记时间,
p.处理标志,
g1.隶属支行,
网点 = g1.网点名,
登记人 = g2.用户名
};
前面的temp1到temp3其实就是对上面的SQL语句最后一个left join临时表做了一个查询,结果保存到temp3里。
最后的result其实就是照搬SQL语句,只是最后的left join成了temp3而已。
问题是这样编译不通过,编译器对最后一个join子句报错:“join子句中起重一个表达式的类型不正确。对join的调用中地类型推理失败”。
我试过取消掉temp1到temp3的临时变量,直接把查询写到join里,结果一样。
难道是临时表的查询太复杂了,所以无法自动连接到linq to sql里面?
对于这个查询,有没有可能直接转换为linq to sql?
请各位指教。谢谢!
SELECT [故障记录表].[序号]
,[故障记录表].[分类]
,[终端信息表].[品牌]
,[网点信息表].[隶属支行]
,[网点信息表].[网点名] as 网点
,[用户信息表].[用户名] as 登记人
,[故障记录表].[标签号]
,[故障分类]
,[故障描述]
,[登记时间]
,[最后处理时间]
,[故障记录表].[处理标志]
FROM [故障记录表]
left join [网点信息表] on [故障记录表].[网点号] = [网点信息表].[网点号]
left join [用户信息表] on [故障记录表].[登记人] = [用户信息表].[登录ID]
left join [终端信息表] on [故障记录表].[标签号] = [终端信息表].[标签号]
left join
(
select a.[故障编号]
,a.[处理标志]
,max(a.[处理时间]) as [最后处理时间]
from [故障处理表] as a,(SELECT distinct [故障编号],[处理标志] FROM [TML].[dbo].[故障处理表]) as b
where a.[故障编号]=b.[故障编号] and a.[处理标志]=b.[处理标志]
group by a.[故障编号],a.[处理标志]
) as table1 on [故障记录表].[序号] = table1.[故障编号] and [故障记录表].[处理标志] = table1.[处理标志]
下面是我尝试转换成的LINQ:
var temp1 = (from p in this.context.故障处理表
select new { p.故障编号, p.处理标志 }).Distinct();
var temp2 = from p in this.context.故障处理表
join o in temp1
on new { p.故障编号, p.处理标志 } equals new { o.故障编号, o.处理标志 }
select new { p.故障编号, p.处理标志, p.处理时间 };
var temp3 = from p in temp2
group p by new { p.故障编号, p.处理标志 } into g
select new { g.Key.故障编号, g.Key.处理标志, 最后处理时间 = g.Max(p => p.处理时间) };
var result = from p in this.context.故障记录表
join o1 in this.context.网点信息表 on p.网点号 equals o1.网点号 into gj1
join o2 in this.context.用户信息表 on p.登记人 equals o2.登录ID into gj2
join o3 in this.context.终端信息表 on p.标签号 equals o3.标签号 into gj3
join o4 in temp3 on new {p.序号, p.处理标志} equals new {o4.故障编号, o4.处理标志} into gj4
from g1 in gj1.DefaultIfEmpty()
from g2 in gj2.DefaultIfEmpty()
from g3 in gj3.DefaultIfEmpty()
from g4 in gj4.DefaultIfEmpty()
select new
{
p.序号,
p.分类,
p.标签号,
p.故障分类,
p.故障描述,
p.登记时间,
p.处理标志,
g1.隶属支行,
网点 = g1.网点名,
登记人 = g2.用户名
};
前面的temp1到temp3其实就是对上面的SQL语句最后一个left join临时表做了一个查询,结果保存到temp3里。
最后的result其实就是照搬SQL语句,只是最后的left join成了temp3而已。
问题是这样编译不通过,编译器对最后一个join子句报错:“join子句中起重一个表达式的类型不正确。对join的调用中地类型推理失败”。
我试过取消掉temp1到temp3的临时变量,直接把查询写到join里,结果一样。
难道是临时表的查询太复杂了,所以无法自动连接到linq to sql里面?
对于这个查询,有没有可能直接转换为linq to sql?
请各位指教。谢谢!
...全文
相关推荐
sql和linq转换小工具,可以自动生产
标题中的“sql和linq转换小工具”是指一个软件或应用程序,它的主要功能是将SQL查询语句自动转换为LINQ(Language Integrated Query)表达式。
SQL 到 LINQ 转换全攻略:.NET 开发者必须掌握的 10 个基本查询
摘要: LINQ 是 .NET 开发中处理数据的核心工具,相比 SQL 提供强类型安全、编译时检查等优势。本文通过 7 个典型查询示例(筛选、投影、排序、分组、联接等),对比 SQL 与 LINQ 的写法,涵盖方法语法和查询表达式两种风格。关键点包括:延迟执行、Lambda 表达式、匿名类型、多级排序及左联接实现。掌握 LINQ 能显著提升代码可读性、减少数据库负载,并与 C# 深度集成,是 .NET 开发者必备技能。(150字)
把sql语句转换成linq的工具Linqer
LINQ的主要优点在于其代码的可读性、类型安全性和编译时检查,这有助于减少运行时错误并提高开发效率。Linqer工具的核心功能就是将SQL查询转换为等效的LINQ表达式。
linq 转换 sql
接下来,我们将讨论如何将LINQ查询转换为SQL。C#编译器会将LINQ查询转换为表达式树,然后由LINQ提供者(如LINQ to SQL)将这些表达式树转化为特定数据库系统的SQL语句。
查看LINQ生成SQL语句的几种方法
在实际开发中,有时我们需要了解LINQ查询是如何转换为SQL语句的,以便于调试和优化性能。以下将详细介绍几种查看LINQ生成SQL语句的方法。1.


LINQ
