2017-08-30 127 views
1

我想要做的是逐行读取数据库,并使用每行的数据初始化数据所代表的类型的对象。在这种情况下,我正在读取Device表的行,并尝试使用该数据创建Device对象。我这看见SO link从c#数据库直接读取对象到类中

,我试过这个片段:

 using(var dc = new DataContext(connectionString)) 
    { 
       List<Person> people = dc.ExecuteQuery(@" 
       SELECT Id, Name Address 
       FROM [People] 
       WHERE [Name] = {0}", name).ToList(); // some LINQ too 
    } 

但它告诉我

类型参数的这种用法不能从使用推断

这是否基本正确或应该使用BondIO串行器/解串器?如上所述here

另外,对象中成员的顺序可能与数据库中列的顺序不同,这是否相关?

当天晚些时候....

我现在有一个的DbContext用这样定义我所有的数据库对象:

public class MyContext : DBContext 
    { 
      public dbSet<Device>{ get; set;} 
      etc... 
    } 

,我现在尝试使用这个片段来获得对象:

using (var db = new MyContext(ConnectionString)) 
     { 
      var res = db.Device.Find(ID); 
     } 

然而,这给出了一个异常消息

未能加载类型“System.Data.Entity.ModelConfiguration.Conventions.AttributeToColumnAnnotationConvention`2

我检查了数据库,并应根据,我传递的PrimaryKey ID返回值1。任何人都有任何暗示我仍然做错了什么。

回答

1

你不能这样做,因为ExecuteQuery用于执行语句,而不用于查询数据库。您应该使用SqlQuery而不是 您可以做的是,要创建一个具有要在查询中设置的属性的新类,则表示查询的简化版本。在你的情况

public class Device 
{ 
    public int Id {get;set} 
    public string Name {get;set} 
    public string Address {get;set} 
} 

然后用它作为

var people = dc.ExecuteQuery<Device>(@" 
       SELECT Id, Name Address 
       FROM [People] 
       WHERE [Name] = {0}", name).ToList(); 
+0

但是,如果我有设备类已经凭借其成员喜欢你定义只是,为什么不能我查询所有列,并直接加载它们进入设备对象? – Alan

+0

我soory - 我的回答是错误的。我正在纠正它。 – HGMamaci

+0

你的意思是ExecuteCommand? DataContext.SqlQuery似乎并不存在.... – Alan