2010-04-15 20 views
9

// Desde mi formaLlenar WinForms DataGridView De Anónimo LINQ consulta

BindingSource bs = new BindingSource(); 

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

// De la clase de administración

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

Estoy intentando rellenar un control DataGridView de formularios Windows Forms, y sólo yo quiero algunos de los valores El código se compila, pero arroja un error de tiempo de ejecución:

No se permite la construcción explícita del tipo de entidad 'DojoManagement.Student' en la consulta.

¿Hay alguna manera de hacerlo funcionar de esta manera?

Respuesta

5

usted ya tiene una instancia IEnumerable<Student> y no se puede proyectar las entidades de una consulta por las razones descritas here)

También don' Necesito crear una lista para enlazar a esta fuente de datos. Puede simplificar enormemente su método cambiándolo a este:

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

No hay ninguna razón para proyectar una nueva instancia que solo haga un mapeo de algunas de las propiedades, al ejecutar la consulta, devuelve todos los valores de todos modos y su proyección no le ahorra nada. Si realmente quiere sólo para regresar unos valores a partir de esta consulta a los efectos de ocultación de la información que podría hacer esto:

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

Editar: Si no está usando C# 4 que tendrá que emitir los contenidos del IEnumerable<T> a Object explícitamente. Solo C# 4 admite la covarianza para IEnumerable<T>. Así que si usted está usando C# 3 que tendrá que hacer esto:

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>(); 
} 
+0

Estoy proyectando una nueva instancia de estudiante porque ... bueno, realmente no sé lo que estoy haciendo (obviamente). Puedo obtener toda la información de todos los estudiantes fácilmente, pero NECESITO algunos de los campos y estoy llenando la vista de cuadrícula de datos en tiempo de ejecución, ya que es de solo lectura. – mdvaldosta

+0

Gracias por el código y la lección. – mdvaldosta

1

sólo devuelve una lista de objetos de un tipo anónimo:

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

Grande, que funciona! No puedo evitar pensar que hay una mejor manera que lanzar. – mdvaldosta

+0

Bueno, no puede devolver una lista de un tipo anónimo, y una 'Lista 'no se puede asignar a una lista de objetos ... por lo que debe emitir. De todos modos, probablemente sería mejor devolver objetos reales de estudiantes de GetStudents, y realizar la proyección solo antes de asignar la fuente de datos. –

3

Una vez que estaba buscando alrededor de una solución a mostrar resultados en un GridView. El problema que tuve fue que olvidé establecer la propiedad de datagrid: "Fuente de datos" en None en Winform.

Esta es una solución simple para gridview pantalla con LINQ (código sólo muestra)

DataGrid dataGrid1 = new DataGrid(); 

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

dataGrid1.DataSource = custQuery; 
+0

Estaba mirando todas las soluciones avanzadas relacionadas con el enlace y pasó por alto el más simple. Este lo resolvió para mí. Gracias – djv

Cuestiones relacionadas