【问题标题】:How to get a strongly typed linq query of a data table and database如何获取数据表和数据库的强类型 linq 查询
【发布时间】:2012-12-12 08:45:56
【问题描述】:

我看到了与我的问题非常相似的其他解决方案,但不知何故它对我不起作用。

我有一个对数据库的 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);

【问题讨论】:

  • 你选择的匿名类型是强类型,请问有什么问题?
  • 如果没有明显错误,那么问题可能更多出在asp.net问题上,而不是我的c#代码。因为它抱怨不可枚举。
  • 为了什么?即使没有多余的AsEnumerable,您的查询也已经是IEnumerable&lt;of an anonymous type&gt;。也许你需要一些不是匿名类型的东西。
  • 是的,这也是一个有趣的方向,我会研究一下。
  • 当您说 Strongly Typed 时,您的意思是 Typed DataSet

标签: c# asp.net linq datatable strong-typing


【解决方案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&lt;MyModel&gt;,您可以在视图中使用它。希望这能解决您的问题,据我了解,这是缺乏从视图访问查询结果的能力。

【讨论】:

  • 好的,我现在试过了。在调试器中,它抱怨表不仅仅是由纯粹的原始类型组成。但是它由两个 int32 列组成,并没有变得更原始!如有必要,我正准备使用与数据表不同的东西。有什么建议吗?
  • 嗯,很难推荐一些东西,因为我不在你的上下文中,对你的要求和环境一无所知。您能否使用您在视图中究竟如何使用查询的详细信息来编辑您的问题?也许您需要在将查询传递到视图之前通过添加额外的 ToList() 来执行查询将其带入内存?
猜你喜欢
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多