Заполнить WinForms DataGridView из анонимного запроса Linq - PullRequest
9 голосов
/ 15 апреля 2010

// Из моей формы

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;
}

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

Явное построение типа сущности 'DojoManagement.Student' в запросе не допускается.

Есть ли способ заставить его работать таким образом?

Ответы [ 3 ]

5 голосов
/ 15 апреля 2010

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

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

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<T> в Object. Только C # 4 поддерживает ковариацию для IEnumerable<T>. Поэтому, если вы используете 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>();
}
3 голосов
/ 08 октября 2012

Однажды я искал решение для отображения результатов в Gridview. Проблема, с которой я столкнулся, заключалась в том, что я забыл установить свойство сетки данных: «Источник данных» на «Нет» в Winform.

Это простое решение для отображения сетки с помощью linq (просто пример кода)

DataGrid dataGrid1 = new DataGrid();

var custQuery =
    from cust in db.Customers
    select cust;

dataGrid1.DataSource = custQuery;
1 голос
/ 15 апреля 2010

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

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...