Как я могу заполнить анонимный тип в списке?

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

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

person ALEXALEXIYEV    schedule 13.08.2010    source источник


Ответы (3)


Я не вижу смысла в вашем методе расширения, так как уже есть метод расширения 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();
person Ben Robinson    schedule 13.08.2010

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

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

select new
{
    tableRaletions.RefMaintenance.RelationId // It's spelt `relations` by the way.
    tableRaletions.RefMaintenance.code,
    tableRaletions.RefMaintenance.shortdesc
};
person djdd87    schedule 13.08.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();
person Cheng Chen    schedule 13.08.2010
comment
Хуже того, что метод MakeList просто возвращает список, содержащий один элемент, переданный в него переменной itemOftype. SetCalculatedTaskField.MakeList(Qry) вернет список, содержащий один элемент с Qry в нем, он не вернет Qry в виде списка. - person Ben Robinson; 13.08.2010