在实体框架 LINQ 查询中使用 Case When

问题描述 投票:0回答:1

我一直在尝试将以下 MS SQL 查询转换为 C# LINQ 的实体框架,但我似乎找不到一种方法来合并其中的 CASE WHEN THEN 部分。有谁有实现此目标的方法吗?

SELECT a.Number, 
CASE WHEN COUNT(DISTINCT b.Id) > 1 THEN 'MULTIPLE' ELSE MAX(b.Test) END AS 'Test',
CASE WHEN COUNT(DISTINCT c.Id) > 1 THEN 'MULTIPLE' ELSE MAX(c.FirstName + ' ' + c.LastName) END AS 'Name',
FROM ZZ.WORK a
INNER JOIN ZZ.PACKAGE b ON a.Id = b.Id
INNER JOIN ZZ.FLOW c    ON b.Id = c.Id
WHERE a.Number = 150
GROUP BY a.Number

我正在将数据选择到这样的对象中

var results = await (from a in dbContext.table1
                     join b in dbContext.table2 on a.Id equals b.Id
                     join c in dbContext.table3 on b.Id equals c.Id                   
                     where a.Number == 150
select new GetDataclass
{
  Value1 = a.Number,
  Value2 = b.Test.Count() > 1 ? "MULTIPLE" : b.Test,
  Value3 = (c.FirstName + ' ' + c.LastName).Count() > 1 ? "MULTIPLE" : (c.FirstName + ' ' + c.LastName)
 }).ToListAsync()

如果我在 MS SQL 中运行此命令,我会返回一行,其中包含值 2/3 的值。当我在 EF 中运行它时,它也返回一行,但我每次都会得到“MULTIPLE”值,即使在这种情况下我不应该这样做。

c# entity-framework linq
1个回答
0
投票

正如评论中提到的:

  1. 您的 LINQ 查询缺少
    GROUP BY
    表达式。
  2. 第二个和第三个属性与SQL查询中的表达式不匹配。您正在计算字符串值的长度,而不是计算表中的(不同的)
    id

您的查询应如下:

var results = await (from a in dbContext.table1
    join b in dbContext.table2 on a.Id equals b.Id
    join c in dbContext.table3 on b.Id equals c.Id                   
    where a.Number == 150
    group new { b, c } by a.Number into grp
    select new
    {
        Value1 = grp.Key,
        Value2 = grp.Select(x => x.b.Id).Distinct().Count() > 1 
            ? "MULTIPLE" 
            : grp.Max(x => x.b.Test),
        Value3 = grp.Select(x => x.c.Id).Distinct().Count() > 1 
            ? "MULTIPLE" 
            : grp.Max(x => x.c.FirstName + ' ' + x.c.LastName)
    }).ToListAsync();
© www.soinside.com 2019 - 2024. All rights reserved.