【发布时间】:2020-12-08 05:41:27
【问题描述】:
我正在尝试将以下查询从 SQL 转换为 EF Core。我可以轻松地使用存储过程(我已经有了 SQL),但我正在尝试了解一些 linq 查询是如何工作的。不幸的是,这绝不是我继承的理想数据库架构,我没有时间将其转换为更好的架构。
DECLARE @userId INT = 3
SELECT *
FROM dbo.CardGamePairs
WHERE EXISTS (SELECT 1
FROM dbo.Users
WHERE Users.Id = CardGamePairs.player1Id
AND Users.userId = @userId)
UNION
SELECT *
FROM dbo.CardGamePairs
WHERE EXISTS (SELECT 1
FROM dbo.Users
WHERE Users.Id = TableB.player2Id
AND Users.userId = @userId)
所以基本上我有一个 id 可以存在于表 b 中的两个单独列之一中,我不知道它可能在哪一列中,但我需要在任一列中具有该 ID 的所有行。以下是我尝试完成的工作:
//Find data from table A where id matches (part of the subquery from above)
var userResults = _userRepository.GetAllAsQueryable(x => x.userId == userId).ToList();
//Get data from table b
var cardGamePairsResults = _cardGamePairsRepository.GetAllAsQueryable(x => userResults .Any(y => y.userId == x.player1Id || y.userId == x.player2Id));
当我运行上面的代码时,我收到以下错误消息:
谓词:(y) => y.userId == x.player1Id || y.userId == x.player2Id))' 无法翻译。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。
关于如何完成这项工作的任何想法? (我尝试将列名和表名更改为真正有意义的名称,希望我不会遗漏任何地方并使其更加混乱。)
【问题讨论】:
-
总是告诉哪个 EF:EF Core 2.0 / 2.1 / 3.x / 5.0 ?还有,
GetAllAsQueryable是从哪里来的? -
你可以试试
x => userResults.Contains(x.player1Id) || userResults.Contains(x.player2Id)吗? -
从第一个查询中删除 ToList。然后你可以继续构建 LINQ 查询。
-
SQL 查询过于复杂。只不过是
WHERE CardGamePairs.player1Id = @userId OR CardGamePairs.player2Id = @userId。 (我认为TableB是一个错字)。
标签: linq entity-framework-core