Pregunta

La autorización así, tengo una clase que se genera cuando creé el LINQ para conexión de SQL.

Básicamente es el siguiente:


    public partial class Product
    {
        public string Name { get; set; }
        public string Description { get; set; }
    }

he ampliado mediante la adición de otra propiedad, como esto:


    public partial class Product
    {
        public string Category { get; set; }    
    }

Ahora tengo una consulta LINQ para obtener los detalles del producto, así:


    public List GetProducts()
    {
        using(MyDataContext dc = new MyDataContext())
        {
            var products = from p in dc.Products
                           select p;
        }
    }

El nuevo campo añadí (Categoría) puede ser recuperada en la consulta LINQ mediante el uso de "p.Category.Description".

Así que mi pregunta es, que es la mejor manera de llenar la clase de producto que incluye la nueva estructura categoría.

preferiría si había una manera de rellenar automáticamente la parte generada de la clase de producto mediante el uso de los datos en la consulta LINQ "seleccione p".

También he pensado de crear un constructor de mi clase parcial que acepta el producto (seleccione P) y la Categoría (seleccione p.Category.Description)

Hacer algo como esto:


    // Linq query calling the constructor
    var products = from p in dc.Products
                   select new Product(p, p.Category.Description)

    // Product Constructor in my extended partial class
    public Product(Product p, string CategoryDescription)
    {
        this = p; // there must be a way to do something like this
        Category = CategoryDescription;
    }

Sin embargo, hay una manera de hacer esto sin tener que enumerar cada propiedad de la clase de productos y establecer cada uno de ellos individualmente ??

¿Fue útil?

Solución

Si desea volver a utilizar el código existente que tenga que crear de Poco lugar:

var products = from p in dc.Products
               select new Product
               {
                   Name = p.Name,
                   Description = p.Description,
                   Category = p.Category.Description
               }

O para que sea aún más fácil, acaba de hacer:

public partial class Product
{
    public string Category
    {
        get { return this.Category.Description; }
        set { this.Category.Description = value; }
    }
}

Otros consejos

LINQ a SQL juega muy bien, siempre y cuando usted deja que haga su cosa por sí mismo. La OMI, el mejor manera de manejar esta situación es dejar el tipo generado DBML-en el DAL - solamente devolver esos si que es exactamente un ajuste del 100% para lo que quiere a cambio.

En su lugar, me gustaría crear un nuevo tipo que es no gestionado por LINQ a SQL, y devolver este lugar (se puede hacer proyecciones basadas inicializador-para tipos no DBML); por ejemplo:

var products = from p in dc.Products // p is implicitly a Product
               select new ExtendedProduct  // our completely unrelated type
               {
                   Id = p.Id,
                   Name = p.Name,
                   //...
                   Category = p.Category.Description
               };

Esto debería permitir obtener sus datos a cabo, sin ningún tipo de problemas n + 1 silenciosas, y sin la queja de datos de contexto. También significa que usted tiene el control completo sobre el que se consultan las columnas y la forma en que se asignan.

En esencia, este utiliza entonces LINQ a SQL solo para hacer la integración de bases de datos, utilizando nuestro propio tipo para la aplicación principal.

Parece que lo que estamos tratando de hacer es algo como esto:

using(MyDataContext dc = new MyDataContext())
{
    var products = from p in dc.Products
                   select p;
    foreach(Product p in products)
        p.Category = p.Category.Description;
}

... que no tiene ningún sentido para mí. Para empezar, uno de los s "categoría" tendrá que ser llamado otra cosa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top