如何获取数据表和数据库的强类型linq查询

本文关键字:数据库 强类型 linq 查询 数据表 何获取 获取 | 更新日期: 2023-09-27 17:49:31

我见过与我的问题非常相似的其他解决方案,但不知何故它不适合我。

我有一个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);

如何获取数据表和数据库的强类型linq查询

我建议使用命名自定义类型,而不是匿名类型。如果您使用的是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>,您可以在视图中使用。希望这将解决您的问题,据我所知,是缺乏从视图访问查询结果的能力。