Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Sql到Linq存在问题_C#_Sql_Linq - Fatal编程技术网

C# Sql到Linq存在问题

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

我已设置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 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)
}