2012-12-26 31 views
1

我已经看到其他解决方案非常类似我的问题,但不知何故它不适用于我。如何获取数据表和数据库的强类型linq查询

我有一个LINQ查询到数据库的连接到非强类型的数据表。 我需要一个强类型的结果来返回一个视图。

我尝试看起来像这样

var query = (from t in queryAllTasks 
      join tL in table.AsEnumerable() on t.TaskId equals tL.Field<int>("TaskId") 
      select new { t.TaskId, Kasten = tL.Field<int>("Box") }).AsEnumerable(); 

下面是数据表,如果其感兴趣的:

//Create new DataTable. 
     DataTable table = new DataTable(); 

     //Declare DataColumn and DataRow variables 
     DataColumn column; 
     DataRow row; 

     //Create ne DataColumn 
     //set DataType 
     //ColumnName 
     //add to Datatable 
     column = new DataColumn(); 
     column.DataType = System.Type.GetType("System.Int32"); 
     column.ColumnName = "TaskId"; 
     table.Columns.Add(column); 

     //Dritte Spalte 
     column = new DataColumn(); 
     column.DataType = System.Type.GetType("System.Int32"); 
     column.ColumnName = "Box"; 
     table.Columns.Add(column); 
+2

您选择的匿名类型是强类型的,那么问题是什么? –

+0

如果没有明显的错误,那么问题可能就是asp.net问题,而不是我的c#代码。因为它抱怨不能永存。 – Wozilla

+2

对于什么?您的查询已经是'IEnumerable <匿名类型>',即使没有多余的AsEnumerable也是如此。也许你需要一些不是匿名类型的东西。 –

回答

1

我建议使用命名的自定义类型,而不是匿名类型。如果您使用的是new { ... }构造,那么您正在创建匿名类型,这些类型通常不会传递出去或放入方法中。如果你将方法中的匿名类型传递出去,你需要将它转换为对象或者将形式参数设置为动态,然后访问它的字段,这并不是我真正推荐的,特别是在视图中。我建议你查询更改为:

var query = from t in queryAllTasks 
      join tL in table.AsEnumerable() on t.TaskId equals tL.Field<int>("TaskId") 
      select new MyModel{ TaskId = t.TaskId, Kasten = tL.Field<int>("Box") }; 

如果你MyModel被定义为

public class MyModel 
{ 
    public int TaskId { get; set; } 
    public int Kasten { get; set; } 
} 

结果,你将有一个名为与已知内部结构的视图IEnumerable<MyModel>,你可以使用你的看法。希望这能解决你的问题,就我所知,这是缺乏从视图访问查询结果的能力。

+0

好吧我现在就试过了。在调试器中,它抱怨表格不仅仅是纯粹的基本类型。但它由两个int32列组成,它不会变得更原始!如有必要,我准备使用与数据表不同的东西。有什么建议吗? – Wozilla

+0

嗯,很难推荐一些东西,因为我不在你的背景下,也不了解你的需求和环境。你能否用视图中的查询详细信息来编辑你的问题?也许你需要执行查询将它传递到内存中通过添加额外的ToList()之前传递查询视图? –

相关问题