【问题标题】:DbContext.Database.SqlQuery returns some null objectsDbContext.Database.SqlQuery 返回一些空对象
【发布时间】:2023-03-08 14:15:01
【问题描述】:

使用Entity Framework 6,下面的代码查询一个表(实际上是一个视图)并返回一些行数。行数是正确的,但许多行为空,即一些 Licenses 对象为空,如 Visual Studio Watch 窗口中所示。我认为正在发生的事情是,如果视图中给定行的任何列包含空值,那么整行都被设置为空值。 关于如何获取所有正确数据的任何想法?

String query = "select * from dbo.v_Licenses where [Number] like '%ab%'";
System.Data.Entity.Infrastructure.DbRawSqlQuery<Licenses> dbRawSqlQuery = db.Database.SqlQuery<Licenses>(query);
Queryable<Licenses> licenses = dbRawSqlQuery.AsQueryable();

【问题讨论】:

  • “行”为空是什么意思?你的意思是一些Licenses 对象是空的?
  • 是的,感谢您指出歧义。添加了说明。

标签: c# sql entity-framework


【解决方案1】:

确保许可证属性的名称与从选择中获取的列相同,并且属性类型也相同。

像这样:

Select CustomerId,Firstname from Customers

public class Customer
{
      public int CustomerId{get;set;}

      public string Firstname {get;set;}
}

并将 System.Data.Entity.Infrastructure.DbRawSqlQuery 更改为 List

我经常使用这种方法,对我来说效果很好。

【讨论】:

  • 感谢您的建议。我已经验证了属性名称和列名称是相同的
【解决方案2】:

就我而言,它不起作用,因为我没有将字段作为属性。一旦我将字段转换为属性,它就可以正常工作。

【讨论】:

  • 这也正是我的问题。我得到了正确的行数,但我的所有字段都是空的。我切换到属性,一切都很好。
【解决方案3】:

基于this question,如果结果集的第一列是null,EF(至少在某一时刻)似乎返回了null 对象。因此,与其选择 *,不如明确命名列并确保 PK(或其他列)在前。

【讨论】:

  • 也感谢您的建议。我更改了代码以显式指定第一列是 Id 定义为 (int, not null) 的列,从而保证第一列不能有空值,我也可以通过查看 SQL Server Management Studio 中的视图来验证.尽管如此,我仍然得到相同的空对象。
  • 阅读您链接到的问题......最后一个答案(来自 Serg Rogovtsev)谈到了NULLABLE 列。在我看来,有些列标记为not null,有些则标记为null。我是否必须在 C# 代码中指定某些内容来区分这些列?
  • 您是使用代码优先还是数据库优先构建Licenses?如果其中一些列(字符串除外)可以为空,您可能需要将它们定义为可以为空的类型(例如int?)。
  • 数据库优先。碰巧的是,除上述Id 之外的所有列都是varchar。我现在正在玩[Required][Column(Order=x)]
  • 我的解决方法是为Id 列指定[Column(Order=0)]。我这样做了,还将select 语句改回 * 而不是指定列。有了这个我没有空对象。
猜你喜欢
  • 2021-03-31
  • 2014-07-15
  • 2018-08-25
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多