Заполните WinForms DataGridView от анонимного запроса Linq

//От моей формы

BindingSource bs = new BindingSource();

private void fillStudentGrid()
{
     bs.DataSource = Admin.GetStudents();
     dgViewStudents.DataSource = bs;
}

//От Администраторского класса

public static List<Student> GetStudents()

{
    DojoDBDataContext conn = new DojoDBDataContext();

    var query =
        (from s in conn.Students
         select new Student
         {
             ID = s.ID,
             FirstName = s.FirstName,
             LastName = s.LastName,
             Belt = s.Belt
         }).ToList();

    return query;
}

Я пытаюсь заполнить управление datagridview в Winforms, и я только хочу несколько значений. Компиляции кода, но броски ошибка периода выполнения:

Явная конструкция объекта вводит 'DojoManagement. Студенту' в запросе не разрешают.

Существует ли способ получить его работающий этим способом?

9
задан John Saunders 15 April 2010 в 17:39
поделиться

2 ответа

У вас уже есть экземпляр IEnumerable , и вы не можете проецировать объекты из запроса по причинам, описанным здесь )

Вам также не нужно создавать список для привязки к этому источнику данных - вы можете значительно упростить свой метод, изменив его на это:

public static IEnumerable<Student> GetStudents()
{
    return new DojoDBDataContext().Students;
}

Нет причин проецировать новый экземпляр только для сопоставления некоторые свойства, выполняя запрос, вы все равно возвращаете все значения, и ваша проекция ничего вам не спасает. Если вы действительно хотите вернуть только несколько значений из этого запроса в целях сокрытия информации, вы можете сделать это:

public static IEnumerable<Object> GetStudents()
{
    DojoDBDataContext conn = new DojoDBDataContext();

    return conn.Students
               .Select(s => new {
                   ID = s.ID,
                   FirstName = s.FirstName,
                   LastName = s.LastName,
                   Belt = s.Belt 
               });
}

Изменить: Если вы не используете C # 4, вам придется преобразовать содержимое IEnumerable в Объект явно. Только C # 4 поддерживает ковариацию для IEnumerable . Итак, если вы используете C # 3, вам нужно будет сделать следующее:

public static IEnumerable<Object> GetStudents()
{
    DojoDBDataContext conn = new DojoDBDataContext();

    return conn.Students
               .Select(s => new {
                   ID = s.ID,
                   FirstName = s.FirstName,
                   LastName = s.LastName,
                   Belt = s.Belt 
               }).Cast<Object>();
}
5
ответ дан 4 December 2019 в 21:48
поделиться

Просто верните список объектов анонимного типа:

public static List<object> GetStudents()
{
    DojoDBDataContext conn = new DojoDBDataContext();

    var query =
        (from s in conn.Students
         select new
         {
             ID = s.ID,
             FirstName = s.FirstName,
             LastName = s.LastName,
             Belt = s.Belt
         }).Cast<object>().ToList();

    return query;
}
1
ответ дан 4 December 2019 в 21:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: