【问题标题】:How to retrieve only some fields from a table using DbSqlQuery in EF 6 (Not Linq)如何在 EF 6(非 Linq)中使用 DbSqlQuery 从表中仅检索某些字段
【发布时间】:2026-01-03 02:10:01
【问题描述】:

使用 EF,根据下面的费率模型创建了费率表:

public class Rate
{
     [Key]
    public int IdNo { get; set; }
    public string RateCode { get; set; }
    public string RateClass { get; set; }
    public string Basis { get; set; }
    public bool RateIsActive { get; set; }
    public DateTime? ValidFrom { get; set; }
    public DateTime? ValidTo { get; set; }
    public bool IsReservRate { get; set; }
    public decimal? CostDay { get; set; }
    public decimal? CostWeek { get; set; }
    public decimal? CostMonth { get; set; }
    public decimal? CostHour { get; set; }
}

我可以使用以下代码从 Rates 表中检索所有列:

using (AppDbContext db = new AppDbContext())
{
    DbSqlQuery<Rate> data = db.Rates.SqlQuery("select * from Rates");
}

但我需要的是从表中只选择两列

DbSqlQuery<Rate> data = db.Rates.SqlQuery("select Rate, Class from Rates");

它给了我以下错误:

数据读取器与指定的“RPManager.Models.Rate”不兼容。类型的成员“RateIsActive”在数据读取器中没有同名的对应列。

有没有办法激活所需的东西? 笔记!!!!我知道如何使用 Linq 来完成,但对于这种特定情况,如果可能的话,必须使用 db.Rates.SqlQuery()

【问题讨论】:

  • 从有效的方法中,你有Rate 和Class 栏吗?使用 * 应该给出所有列名。
  • 能否提供Rate实体。
  • 仅当您具体化为仅具有属性子集的类时。为什么要创建不完整的Rate 实体?
  • @Gert Arnold 避免通过网络发送不必要的数据。一旦选择了速率/等级,那么只有一行包含所有列就足够了。但我明白你的意思,我已经在其他情况下应用了它。如果您知道这是唯一的方法,并且如果您将其作为答案发布,我将接受它。

标签: c# sql entity-framework linq


【解决方案1】:

有没有办法激活需要的东西?

与提供的代码无关。你有几个选择。

您的最佳选择:

创建一个代表你需要的类,而不是重用一个类仅仅因为

public class RateInfo
{
  public x Rate { get; set; }
  public x Class { get; set; }
}

var data = db.Rates.SqlQuery<RateInfo>("select Rate, Class from Rates");

或者没有那么好;通过 sql 别名设置默认值:

// assumming you have an Id column
var data = db.Rates.SqlQuery<Rate>("select 0 as ID, Rate, Class from Rates");

【讨论】:

  • 您的解决方案有效。只需要将 var data = db.Rates.SqlQuery 替换为 var data = db.Database.SqlQuery
最近更新 更多