C# Sql到Linq存在问题
我已设置sql查询:C# Sql到Linq存在问题,c#,sql,linq,C#,Sql,Linq,我已设置sql查询: select sm.coddeposito as coddeposito, rd.codart as codart, ast.codsottotipo as codsottotipo, ast.descrizionesottotipo as descrizionesottotipo, sum(sm.GIACENZA * sm.QTA1UM) as giacenza1, sum(sm.GIACENZA2UM * sm.QTA2UM) as giacen
select
sm.coddeposito as coddeposito,
rd.codart as codart,
ast.codsottotipo as codsottotipo,
ast.descrizionesottotipo as descrizionesottotipo,
sum(sm.GIACENZA * sm.QTA1UM) as giacenza1,
sum(sm.GIACENZA2UM * sm.QTA2UM) as giacenza2,
sum(sm.ordinato * sm.QTA1UM) as ordinato1,
sum(sm.ordinato2UM * sm.QTA2UM) as ordinato2,
sum(sm.impegnato * sm.QTA1UM) as impegnato1,
sum(sm.impegnato2UM * sm.QTA2UM) as impegnato2
from Programmi.dbo.SAN_STORICOMAG as sm
join programmi.dbo.san_righedocumenti
as rd on sm.IDTESTA = rd.idtesta and sm.rigadoc = rd.idriga
join programmi.dbo.SAN_EXTRARIGHEDOC
as erd on rd.idtesta = erd.idtesta and rd.idriga = erd.idriga
join programmi.dbo.tk_tab_anasottotipi
as ast on erd.tk_codsottotipo = ast.CODSOTTOTIPO
where sm.codart like '%RTM%'
and erd.Tk_CodSottotipo <> ''
and erd.Tk_CodSottotipo is not null
group by
sm.coddeposito,
rd.codart,
ast.codsottotipo,
ast.descrizionesottotipo
order by
sm.coddeposito,
rd.codart,
ast.codsottotipo,
ast.descrizionesottotipo
另一个问题是,使用此LINQ查询,在group by声明之后,我无法访问其中的成员。我将提出一个不同的解决方案,以便不直接处理LINQ语句。对于更复杂的查询,而且这个查询无论如何都不太复杂,通常最好创建一个SQL视图,然后基于该SQL视图在c中创建一个EF模型。这还允许您根据自己的需要更轻松地调整sql,而无需重新访问c中的Linq查询来查看它在sql中生成了什么。sql中的最终结果linq查询和生成的sql语句之间的转换可能会因您使用的ORM而异,其中作为自定义sql视图,它将始终是静态的,并保持您定义它的方式 创建您的视图:
CREATE VIEW MyCustomView
AS
select
sm.coddeposito as coddeposito,
rd.codart as codart,
ast.codsottotipo as codsottotipo,
ast.descrizionesottotipo as descrizionesottotipo,
sum(sm.GIACENZA * sm.QTA1UM) as giacenza1,
sum(sm.GIACENZA2UM * sm.QTA2UM) as giacenza2,
sum(sm.ordinato * sm.QTA1UM) as ordinato1,
sum(sm.ordinato2UM * sm.QTA2UM) as ordinato2,
sum(sm.impegnato * sm.QTA1UM) as impegnato1,
sum(sm.impegnato2UM * sm.QTA2UM) as impegnato2
from Programmi.dbo.SAN_STORICOMAG as sm
join programmi.dbo.san_righedocumenti
as rd on sm.IDTESTA = rd.idtesta and sm.rigadoc = rd.idriga
join programmi.dbo.SAN_EXTRARIGHEDOC
as erd on rd.idtesta = erd.idtesta and rd.idriga = erd.idriga
join programmi.dbo.tk_tab_anasottotipi
as ast on erd.tk_codsottotipo = ast.CODSOTTOTIPO
where sm.codart like '%RTM%'
and erd.Tk_CodSottotipo <> ''
and erd.Tk_CodSottotipo is not null
group by
sm.coddeposito,
rd.codart,
ast.codsottotipo,
ast.descrizionesottotipo
order by
sm.coddeposito,
rd.codart,
ast.codsottotipo,
ast.descrizionesottotipo
您没有提到这是Linq还是EF或其他ORM,但您的下一步是映射此模型,方法与您正在使用的ORM中的其他模型相同
如果知道WHERE子句中的某些过滤器是动态的,那么也可以删除它们。然后,您仍然可以根据需要在Linq代码中应用它们
免责声明
我没有检查您的查询的准确性或效率,因此,如果有错误或更好的生成联接的方法,我没有查找它们。类似的方法应该可以:
from sm in Programmi.dbo.SAN_STORICOMAG
join rd in programmi.dbo.san_righedocumenti
on new { condition1 = sm.IDTESTA, condition2 = sm.rigadoc }
equals new { condition1 = rd.idtesta, condition2 = rd.idriga }
join erd in programmi.dbo.SAN_EXTRARIGHEDOC
on new { condition1 = rd.idtesta, condition2 = rd.idriga }
equals new { condition1 = erd.idtesta, condition2 = erd.idriga }
join ast in programmi.dbo.tk_tab_anasottotipi
on erd.tk_codsottotipo
equals ast.CODSOTTOTIPO
where sm.codart.Contains("RTM")
and erd.Tk_CodSottotipo <> ''
and erd.Tk_CodSottotipo != null
group new {
Giacenza = sm.GIACENZA,
Qta1um = sm.QTA1UM,
Giacenza2um = sm.GIACENZA2UM,
Qta2um = sm.QTA2UM,
Ordinato = sm.ordinato,
Ordinato2UM = sm.ordinato2UM,
Impegnato = sm.impegnato,
Impegnato2UM = sm.impegnato2UM
}
by new {
Coddeposito = sm.coddeposito,
Codart = rd.codart,
Codsottotipo = ast.codsottotipo,
Descrizionesottotipo = ast.descrizionesottotipo
} into g
order by g.Key.Coddeposito, g.Key.Codart, g.Key.Codsottotipo, g.Key.Descrizionesottotipo
select new
{
coddeposito = g.Key.Coddeposito,
codart = g.Key.Codart,
codsottotipo = g.Key.Codsottotipo,
descrizionesottotipo = g.Key.Descrizionesottotipo,
giacenza1 = g.Sum(p => p.Giacenza * p.Qta1um),
giacenza2 = g.Sum(p => p.Giacenza2um * p.Qta2um),
ordinato1 = g.Sum(p => p.Ordinato * p.Qta1um),
ordinato2UM = g.Sum(p => p.Ordinato2UM * p.Qta2um),
impegnato1 = g.Sum(p => p.Impegnato * p.Qta1um),
impegnato2 = g.Sum(p => p.Impegnato2UM * p.Qta2um)
}
当您的linq运行时,是否有成员计数?从x中的xx进入x听起来像是一个糟糕的命名过程。。如果你给出你的结构,你创建的是第一个linq名称,而不仅仅是新的{},会发生什么?因此,新的{Coddepostio=sm.Coddepostio..etc}诚实地处理复杂的查询,而这个查询并不太复杂,无论如何,创建一个SQL视图,然后基于该SQL视图在c中创建一个EF模型通常要容易得多。这还可以让您更轻松地根据自己的需要调整sql,而无需重新访问c中的Linq查询以查看它在sql中生成的内容。您是否缺少左侧外部联接?见以下:谢谢你,伊戈尔
public class MyModel {
public object coddeposito { get; set; }
public object codart { get; set; }
public object codsottotipo { get; set; }
public object descrizionesottotipo { get; set; }
public int giacenza1 { get; set; }
public int giacenza2 { get; set; }
public int ordinato1 { get; set; }
public int ordinato2 { get; set; }
public int impegnato1 { get; set; }
public int impegnato2 { get; set; }
}
from sm in Programmi.dbo.SAN_STORICOMAG
join rd in programmi.dbo.san_righedocumenti
on new { condition1 = sm.IDTESTA, condition2 = sm.rigadoc }
equals new { condition1 = rd.idtesta, condition2 = rd.idriga }
join erd in programmi.dbo.SAN_EXTRARIGHEDOC
on new { condition1 = rd.idtesta, condition2 = rd.idriga }
equals new { condition1 = erd.idtesta, condition2 = erd.idriga }
join ast in programmi.dbo.tk_tab_anasottotipi
on erd.tk_codsottotipo
equals ast.CODSOTTOTIPO
where sm.codart.Contains("RTM")
and erd.Tk_CodSottotipo <> ''
and erd.Tk_CodSottotipo != null
group new {
Giacenza = sm.GIACENZA,
Qta1um = sm.QTA1UM,
Giacenza2um = sm.GIACENZA2UM,
Qta2um = sm.QTA2UM,
Ordinato = sm.ordinato,
Ordinato2UM = sm.ordinato2UM,
Impegnato = sm.impegnato,
Impegnato2UM = sm.impegnato2UM
}
by new {
Coddeposito = sm.coddeposito,
Codart = rd.codart,
Codsottotipo = ast.codsottotipo,
Descrizionesottotipo = ast.descrizionesottotipo
} into g
order by g.Key.Coddeposito, g.Key.Codart, g.Key.Codsottotipo, g.Key.Descrizionesottotipo
select new
{
coddeposito = g.Key.Coddeposito,
codart = g.Key.Codart,
codsottotipo = g.Key.Codsottotipo,
descrizionesottotipo = g.Key.Descrizionesottotipo,
giacenza1 = g.Sum(p => p.Giacenza * p.Qta1um),
giacenza2 = g.Sum(p => p.Giacenza2um * p.Qta2um),
ordinato1 = g.Sum(p => p.Ordinato * p.Qta1um),
ordinato2UM = g.Sum(p => p.Ordinato2UM * p.Qta2um),
impegnato1 = g.Sum(p => p.Impegnato * p.Qta1um),
impegnato2 = g.Sum(p => p.Impegnato2UM * p.Qta2um)
}