【发布时间】:2020-10-10 12:28:31
【问题描述】:
UPDATE m
SET m.Score = s.AScore + '-' + s.BScore
FROM #Matches m
INNER JOIN Scores s ON m.MatchId = s.MatchId
AND s.InfoTypeId = (
CASE
WHEN m.SportId = 1 AND (m.StatusId >= 13 AND m.StatusId <= 17) THEN 10
WHEN m.SportId = 1 AND m.StatusId = 20 THEN 24
WHEN m.SportId = 1 AND m.StatusId = 21 THEN 23
WHEN m.SportId = 1 AND m.StatusId = 18 THEN 8
ELSE 5
END
)
我在 C# 中有两个列表,一个是 Matches,第二个是 Scores,我想从这些列表中获取结果,就像这个查询将返回的结果一样。表示我想更新“匹配”列表的“分数”属性,就像它在 SQL 查询中更新一样。
请提供任何帮助。
Matches.ForEach(m => m.Score = (Scores.Where(ms => ms.MatchId == m.MatchId
&& ms.ScoreInfoTypeId == ((m.SportId == 1 && m.StatusId >= 13 && m.StatusId <= 17) ? 10
: (m.SportId == 1 && m.StatusId == 20) ? 24
: (m.SportId == 1 && m.StatusId == 21) ? 23
: (m.SportId == 1 && m.StatusId == 18) ? 8
: 5)).Select(ms => ms.AScore + "-" + ms.BScore).FirstOrDefault()));
我试过了,但我觉得它太贵了。这需要太多时间。请问有什么优化的方法吗?
【问题讨论】:
-
您使用哪种 ORM? EF 6、EF Core、LInq2db,还有什么?
-
我不清楚,你想实现什么。1)你只是想以某种方式生成完全相同的 Sql,2)你想制作自动计算属性 3)你想设计一个解决方案,这也是一样的,但在 c# 4) 中还有别的吗?
-
使用 linq2db 很容易。但 EF 查询可能取决于匹配的大小 - 或者根本不可能。
-
@AlexanderPetrov,我正在开发 .net Core。我没有使用EF。我已经使用 Dapper 获得了列表。我正在尝试使用 LINQ 或 lambda 表达式来实现这个概念。请问你能做到吗。如果您需要有关此查询的更多信息,请告诉我,我会提供。谢谢。