带有group by和have子句的Linq语法



我试图通过具有子句的linq语法从数据表中获取列表。

但我没有得到我想要的。

以下是SQL语法:

SELECT ID_BEN,
GAR1,
FIRST(FIRST_NAME) FIRST_NAME,
FIRST(LAST_NAME) LAST_NAME,
FIRST(ADR1) ADR1,
FIRST(ADR2) ADR2,
FIRST(ZIP_CODE) ZIP_CODE,
FIRST(CITY) CITY,
SUM(AMOUNT) SUM_AMOUNT,
SUM(CASE WHEN STATUS_TAB <> 'OK' THEN 1 ELSE 0 END) NUM_STATUS_TAB
FROM T_AMOUNT
WHERE STATUS_ENR = 'OK' AND STATE_ENR = '1'
GROUP BY ID_BEN, GAR1
HAVING SUM(CASE WHEN STATUS_TAB <> 'OK' THEN 1 ELSE 0 END) = 0

这是我的linq语法:

var oLstReglementGrp = objDataSet.T_AMOUNT
.AsEnumerable()
.Select(sel => new
{
ID_BEN = sel.ID_BEN,
GAR1 = sel.GAR1,
LI_NOM = sel.First().FIRST_NAME,
LI_ADR1 = sel.First().LAST_NAME,
LI_ADR2 = sel.First().ADR1,
LI_ADR3 = sel.First().ADR2,
LI_ADR4 = sel.First().ZIP_CODE,
CD_PST = sel.First().CITY

})
.Where(x => x.STATUS_ENR == "OK"
&& x.STATE_ENR == "1")
.GroupBy(row => new { ID_BEN = (long?)row.ID_BEN, GAR1 = row.GAR1 },
(g, r) => new
{
NUM_STATUS_TAB = r.Sum(s => s.STATUS_TAB != "OK" ? 1 : 0),
SUM_AMOUNT = r.Sum(s => (decimal?)s.AMOUNT)
})
.Where(p => p.NUM_STATUS_TAB == 0)
.ToList();

以下是SQL结果:

FIRST_NAME  LAST_NAME   ADR1        ZIP_CODE    CITY        SUM_AMOUNT  NUM_STATUS_TAB
Jack        Palance     3 bd One    1234        New York    12000       0   
John        Wayne       4 ave 2     4567        Los Angeles 5500        0           
Jimmy       Page        5 street 2  2345        Chicago     450         0

在我的列表中:

SUM_AMOUNT  NUM_STATUS_TAB
12000       0   
5500        0           
450         0

你有主意吗?

在编写LinQ时,您不应该像阅读它那样尝试转换为SQL查询。
LinQ语法更接近SQL执行顺序。在这种方式下,林克更";逻辑的";。

SQL执行顺序如下:

  1. FROM和JOIN
  2. 其中
  3. 分组依据
  4. 具有
  5. 选择
objDataSet
// 1. FROM and JOINs
.T_AMOUNT   

//2. WHERE  
.Where(x => x.STATUS_ENR == "OK" && x.STATE_ENR == "1") 

//3. GROUP BY 
.GroupBy(row => new { ID_BEN = (long?)row.ID_BEN, GAR1 = row.GAR1 })

//5. SELECT 
.Select(sel => new
{
ID_BEN = sel.Key.ID_BEN,
GAR1 = sel.Key.GAR1,
LI_NOM = sel.First().FIRST_NAME,
LI_ADR1 = sel.First().LAST_NAME,
LI_ADR2 = sel.First().ADR1,
LI_ADR3 = sel.First().ADR2,
LI_ADR4 = sel.First().ZIP_CODE,
CD_PST = sel.First().CITY,
NUM_STATUS_TAB = sel.Sum(s => s.STATUS_TAB != "OK" ? 1 : 0),
SUM_AMOUNT = sel.Sum(s => (decimal?)s.AMOUNT)
})

//4. HAVING
.Where(p => p.NUM_STATUS_TAB == 0)
.ToList();

步骤4和5已经交换,因为我们正在筛选groupby中不存在的字段,所以我们需要select才能使其可用。

在步骤3。GROUP BY,注意使用了过载。订单由有9个过载,MS文档。在你熟悉之前,我会建议你使用简单的

最新更新