【问题标题】:Transform Sql to EF Core Linq query将 Sql 转换为 EF Core Linq 查询
【发布时间】: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


【解决方案1】:

因为您已经有了用户 ID,所以用它来查询两列。

var userResults = _userRepository
  .GetAllAsQueryable(x => x.userId == userId)
  .ToList();

var cardGamePairsResults = _cardGamePairsRepository
  .GetAllAsQueryable(x => x.player1Id == userId || x.player2Id == userId));

【讨论】:

    猜你喜欢
    • 2020-06-14
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 2023-03-11
    • 2016-11-25
    • 1970-01-01
    • 2014-08-14
    相关资源
    最近更新 更多