2010-08-13 120 views
0

我嘗試寫一些代碼通過下面的代碼有關生成匿名類型列表:如何填寫匿名類型列表?

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(); 

回答

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

你已經指定了一個不是在你的數據源存在KeyFieldName。究竟錯誤在說什麼。就我的例子而言,這與通用列表的數量無關。

從你的例子中,我猜你的主鍵是RelationId而你的KeyFieldName被設置爲該屬性。因此,只要改變確保RelationId是回報您的選擇:

select new 
{ 
    tableRaletions.RefMaintenance.RelationId // It's spelt `relations` by the way. 
    tableRaletions.RefMaintenance.code, 
    tableRaletions.RefMaintenance.shortdesc 
}; 
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(); 
+0

我試圖從任何類返回列表值,但我必須列出定義... – Penguen 2010-08-13 10:30:38

+1

更糟糕的是比MakeList方法簡單地返回一個列表包含itemOftype變量傳遞給它的單個項目。 'SetCalculatedTaskField.MakeList(Qry)'將返回一個列表,其中包含一個帶有'Qry'的項目,它不會返回'Qry'作爲列表。 – 2010-08-13 13:20:37