我一直在尝试将以下 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”值,即使在这种情况下我不应该这样做。
正如评论中提到的:
GROUP BY
表达式。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();