【问题标题】:Good query returning no results using DbContext with ADO.NET使用 DbContext 和 ADO.NET 的良好查询不返回任何结果
【发布时间】:2020-06-22 21:08:41
【问题描述】:

我需要在我的数据库上下文中运行以下查询。

SELECT u.[Email],
u.[EmailConfirmed],
u.[PhoneNumber],
STRING_AGG(r.[Name], ', ') AS Roles
FROM [AspNetUsers] u
LEFT OUTER JOIN [AspNetUserRoles] ur ON ur.UserId = u.Id
LEFT OUTER JOIN [AspNetRoles] r ON r.Id = ur.RoleId
GROUP BY u.[Email], u.[EmailConfirmed], u.[PhoneNumber]

当我在查询窗口中运行它时,我得到四个结果。所以我想出了以下代码。

string UserQuery = @"SELECT u.[Email],
u.[EmailConfirmed],
u.[PhoneNumber],
STRING_AGG(r.[Name], ', ') AS Roles
FROM [AspNetUsers] u
LEFT OUTER JOIN [AspNetUserRoles] ur ON ur.UserId = u.Id
LEFT OUTER JOIN [AspNetRoles] r ON r.Id = ur.RoleId
GROUP BY u.[Email], u.[EmailConfirmed], u.[PhoneNumber]";

var conn = DbContext.Database.GetDbConnection();
using var cmd = conn.CreateCommand();
cmd.CommandText = UserQuery;
DbContext.Database.OpenConnection();
using var reader = cmd.ExecuteReader();
while (reader.NextResult())
{
    Users.Add(new UserViewModel
    {
        Email = (string)reader["Email"],
        EmailConfirmed = (bool)reader["EmailConfirmed"],
        Phone = (string)reader["PhoneNumber"],
        Role = (string)reader["Roles"]
    });
}

这段代码运行没有错误,但第一次调用reader.NextResult()返回false!

谁能看到我错过了什么?

【问题讨论】:

  • 你的上下文是否指向同一个数据库?
  • 您的意思是查询工作的同一个数据库?当然是。四个结果证实这是我正在使用的数据库。
  • 可能是字符串没有正确转义。你可以试试这个:pastebin.com/Z7KAY9mN

标签: c# asp.net-core entity-framework-core entity-framework-6 ado.net


【解决方案1】:

应该是reader.Read() 因为reader.NextResult() 将带回下一个结果设置

见:

Difference between SqlDataReader.Read and SqlDataReader.NextResult

【讨论】:

  • 好吧,我不觉得自己很愚蠢。猜猜我已经有一段时间没有使用原始 ADO.NET 了。
猜你喜欢
  • 2019-10-27
  • 1970-01-01
  • 2016-12-22
  • 1970-01-01
  • 2018-05-28
  • 2019-04-10
  • 2013-12-24
  • 1970-01-01
相关资源
最近更新 更多