为什么EF Database.SqlQuery <t>无法使用实体类型进行部分选择?

时间:2018-11-19 08:51:33

标签: c# entity-framework

我有一个针对EF的代码优先课程:

public partial class table_test
{
    [Key]
    public int pKey { get; set; }

    [Required(AllowEmptyStrings = true)]
    [StringLength(50)]
    public string Name { get; set; }
}

和一个DbContext:

public class Test_Context : DbContext
{
    public Test_Context()
         : base("name=Conn")
    {
    }

    public DbSet<table_test> table_test { get; set; }
}

我要查询该表中的一些数据:

var items = context.table_test.ToArray();
var items2 = context.Database.SqlQuery<table_test>("SELECT * FROM table_test").ToArray();
var items3 = context.Database.SqlQuery<table_test>("SELECT pKey FROM table_test").ToArray();

然后我得到一个错误:

  

数据读取器与指定的版本不兼容   'UnitTestProject1.table_test'。类型“名称”的成员不   在数据读取器中有一个具有相同名称的对应列。

EF Database.SqlQuery with entity type

原因是什么?

2 个答案:

答案 0 :(得分:0)

如评论中的Tetsuya Yamamoto所示,仅拥有table_test时,您就无法映射到"SELECT pKey FROM table_test"类。

我不知道您数据库的内容,所以我只写一个一般性的答案 改变这个

pKey

进入

"SELECT pKey FROM table_test"

但是作为一般规则,您不应该在查询数据库时使用“ RAW字符串”在其之上添加抽象层,这样在您更改DTO中的属性名称时,便会更容易

答案 1 :(得分:0)

此行产生了异常,因为您仅选择了EF期望int n=sc.nextInt(); //sc is scanner int a[]=new int[n]; for(int i=0;i<n;i++) { a[i]=sc.nextInt(); } int count=0; for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) if(i+j==a[i]+a[j]) count++; } System.out.println(count); 内部的属性映射定义的两列,即table_testpKey

Name

如果只想选择var items3 = context.Database.SqlQuery<table_test>("SELECT pKey FROM table_test").ToArray(); ,只需使用现有pKey数组中的LINQ Select()(注意:首先放置items2

using System.Linq;