【问题标题】:Translate sql query to linq so I can use it in foreach loop将 sql 查询转换为 linq,以便我可以在 foreach 循环中使用它
【发布时间】:2021-07-07 00:36:03
【问题描述】:

我有一个要转换为 LINQ 的 sql 查询,以便在 foreach 循环中访问 h.name 和 a.ActivityName

  SELECT al.HamsterID, 
         h.name, 
         a.ActivityName, 
         al.Time
    FROM ActivityLog al 
    JOIN Activities a ON a.id = al.ActivityID 
    JOIN Hamsters h ON h.HamsterID = al.HamsterID
ORDER BY HamsterID

目前它返回 Hamster 和 Activity 为 null,它们是 ActivityLog 中的属性

【问题讨论】:

  • 有什么问题?
  • 我仍在网上寻找一些解决方案。我已经尝试了 .Join 方法,但我无法让它工作
  • SQL 无法转换为 LINQ。可以编写或多或少重现 SQL 查询的 LINQ,但这需要了解 LINQ 构建块的知识,此处均未披露。
  • 您使用的是实体吗?如果你有一个上下文 dbContext 并且它有一个表(类)列表并且每个类都有行。所以一个表将是 dbContext.ActivityLog。你的 for 循环看起来像:foreach(var row in dbContext.ActivityLog)

标签: c# sql linq foreach entity-framework-core


【解决方案1】:

如果您首先使用数据库,并假设您已经在数据库对象中定义了主/外键关系,EF 将生成对父/子关系进行编码的类文件。因此 EF 生成的 Hamster 类将具有 ActivityLog 属性,ActivityLog 类将具有 Hamsters >Activites 属性等。如果您首先使用代码,则需要自己在数据库对象类定义和/或 DbContext.OnModelCreating 方法中执行此操作。这样就可以处理 SQL SELECTFROM 子句了。 SQL 中的 ORDER BY 子句在 Linq 中将变为 .OrderBy(x => x.HamsterID)

如果使用 DBContext 日志属性写入控制台或日志文件等,可以看到 linq 生成和执行的 SQL。

如果 ActivityLog 实例的 Hamster 和 Activity 属性为空,那么您应该检查 ActivityLog.HamsterIDActivityLog.ActivityID 的值是否存在于 Hamster 表和 Activity 表。如果是这样,那么您的代码就有问题,无论是在数据库对象类定义和/或 DbContext.OnModelCreating 方法中。

【讨论】:

    猜你喜欢
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    相关资源
    最近更新 更多