如何在列表中填写匿名类型?

时间:2010-08-13 09:08:47

标签: c# .net linq linq-to-sql anonymous-types

我尝试通过以下代码编写一些关于生成匿名类型列表的代码:

public static List<T> MakeList<T>(T itemOftype)
{
    List<T> newList = new List<T>();
    newList.Add(itemOftype);
    return newList;
}

但是错误让我回答:

  

通过指定的主键字段   找不到KeyFieldName属性   基础数据源。确保   字段名称拼写正确。   注意角色案例。

Main.cs


var Qry = from tableRaletions in taskMaints.TaskRelations
    where tableRaletions.TaskId == Convert.ToInt32(txtID.Text) && tableRaletions.RelTypeId == 12
    select new
    {
        tableRaletions.RefMaintenance.code,
        tableRaletions.RefMaintenance.shortdesc
    };
GridMaintenanceData.DataSource = SetCalculatedTaskField.MakeList(Qry);
GridMaintenanceData.DataBind();

3 个答案:

答案 0 :(得分:1)

我没有看到你的扩展方法的重点,因为已经有一个ToList扩展方法,并且会创建你的anymous类型的列表,你的方法将做的是创建一个列表,其中包含一个单独的项目是您的匿名类型的IQueryable。其次,错误是说GridMaintenanceData有一个名为KeyFieldName的属性,你在那里指定了一个在你绑定它的数据源中不存在的字段名,可能是因为你的愚蠢的MakeList方法。

请改为:

var Qry = from tableRaletions in taskMaints.TaskRelations
    where tableRaletions.TaskId == Convert.ToInt32(txtID.Text) && tableRaletions.RelTypeId == 12
    select new
    {
        tableRaletions.RefMaintenance.code,
        tableRaletions.RefMaintenance.shortdesc
    };
GridMaintenanceData.DataSource = Qry.ToList();
GridMaintenanceData.DataBind();

答案 1 :(得分:1)

您已经指定了DataSource中不存在的KeyFieldName。究竟错误是什么。据我所知,这与您的通用列表的填充无关。

从您的示例中,我猜测您的主键是RelationId,而您的KeyFieldName设置为该属性。因此,只需更改确保在您的选择中返回RelationId:

select new
{
    tableRaletions.RefMaintenance.RelationId // It's spelt `relations` by the way.
    tableRaletions.RefMaintenance.code,
    tableRaletions.RefMaintenance.shortdesc
};

答案 2 :(得分:0)

这是你的代码:

public static List<T> MakeList<T>(T itemOftype)
{
    List<T> newList = new List<T>();
    newList.Add(itemOftype);
    return newList;
}

你有什么不直接使用List<T>MakeList<T>的目的是什么?和

SetCalculatedTaskField.MakeList(Qry)

可以更容易:

Qry.ToList();