Как я могу заполнить анонимный тип в списке? - PullRequest
0 голосов
/ 13 августа 2010

Я пытаюсь написать несколько кодов о генерации списка из анонимного типа с помощью следующих кодов:

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 ]

1 голос
/ 13 августа 2010

Вы указали KeyFieldName, которого нет в вашем источнике данных. Именно то, что говорит об ошибке. Насколько я могу судить из вашего примера, это не имеет никакого отношения к населению вашего общего списка.

Из вашего примера, я предполагаю, что ваш первичный ключ - RelationId, а для KeyFieldName установлено это свойство. Так что просто измените, убедитесь, что RelationId возвращается в ваш выбор:

select new
{
    tableRaletions.RefMaintenance.RelationId // It's spelt `relations` by the way.
    tableRaletions.RefMaintenance.code,
    tableRaletions.RefMaintenance.shortdesc
};
1 голос
/ 13 августа 2010

Я не вижу смысла в вашем методе расширения, так как метод расширения ToList уже существует, и он создаст список вашего любого типа, и ваш метод будет создавать список с одним элементом, который это 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();
0 голосов
/ 13 августа 2010

Вот ваш код:

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