por favor, puede echar un vistazo a mi código y me apunte en la dirección correcta.
Tengo 2 tablas : Productos y vProductAndDescription. Necesito el Nombre y LisPrice de Producto y la Descripción de vProductAndDescription acompañados por sus ProductID respectivamente. Estoy en el camino correcto para alcanzar este en mi punto de vista? Porque hasta ahora se acaba de estrellarse.

Controlador:

public ActionResult Index()
        {
            string query = "SELECT v.Name, p.ListPrice, LEFT(v.Description, 20) from SalesLT.vProductAndDescription v, SalesLT.Product p WHERE v.ProductID = p.ProductID";
            var list = db.Database.SqlQuery<Product>(query);              
            var result = from a in list.ToList()
                    join b in db.vProductAndDescriptions on a.ProductID equals b.ProductID
                    select new
                    {
                        c = a.Name,
                        d = a.ListPrice,
                        e = b.Description
                    };
            return View(result.ToList());
}

Vista:

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<table>
    <tr>
        <th>Name
        </th>
        <th>Price (R)
        </th>
        <th>Description
        </th>
        <th></th>
    </tr>

@foreach (var item in ViewData.Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.ListPrice)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Description)
        </td>
    </tr>
}
</table>
  • ¿Qué error qué se obtiene?
  • EntityCommandExecutionException fue controlada por el código de usuario, El lector de datos es incompatible con el especificado ‘AdventureWorksLT2008R2Model.Producto». Un miembro de la clase, ‘Idproducto’, no tiene una columna correspondiente en el lector de datos con el mismo nombre.
  • Eso no tiene absolutamente ningún sentido en absoluto para mí, porque claramente tiene una columna correspondiente, es obvio. Seguramente hay una forma más fácil de unir dos tablas y los muestra en una vista?
InformationsquelleAutor Chris | 2013-08-05

1 Comentario

  1. 2

    Su llamada var list = db.Database.SqlQuery<Product>(query); tratando de crear una Lista de tipo Product pero su consulta no devuelve un ProductID parámetro necesario para crear el Product tipo. También, ¿qué tipo de espera de la línea de

    var result = from a in list.ToList()
                    join b in db.vProductAndDescriptions on a.ProductID equals b.ProductID
                    select new
                    {
                        c = a.Name,
                        d = a.ListPrice,
                        e = b.Description
                    };

    Para empezar, usted necesita un ViewModel para mantener sus valores, ya que no están pasando un todo objeto existente a la vista.

    public class ProductDescriptionsViewModel {
        public string Name {get;set;}
        public string ListPrice {get;set;}
        public string Description {get;set;}
    }

    en la Vista código en la parte superior:

    @model IEnumerable<YourFullNamespace.ProductDescriptionsViewModel>

    en su consulta que en realidad están haciendo 2 llamadas en la base de datos, vamos a ver si podemos volver a organizar las cosas para obtener una llamada:

    string query = "SELECT v.Name as Name, p.ListPrice as ListPrice, LEFT(v.Description, 20) as Description from SalesLT.vProductAndDescription v, SalesLT.Product p WHERE v.ProductID = p.ProductID";
    var viewModel = db.Database.SqlQuery<ProductDescriptionsViewModel>(query);
    • Yo estaba tratando de hacerlo con una prima de consultas sql como solo necesito el Nombre, ListPrice y 20 primeras palabras de la descripción.
    • Estoy tratando de encontrar una manera de ilustrar lo que se necesitan hacer cambios en el código aquí, y estoy seguro de que podemos trabajar como una materia prima llamada sql.
    • Ya tengo el anterior sugiere la viewmodel, y debe incluir el Identificador de lo contrario la una.ProductID parte de la var resultado no va a funcionar. Me estoy poniendo un par de errores extraños. Error : El modelo de elemento pasado en el diccionario es de tipo ‘System.Las colecciones.Genérica.Lista De1[<>f__AnonymousType43[Sistema.De Cadena,Sistema.Decimal,Sistema.Cadena]]’, pero este diccionario se requiere un elemento de modelo de tipo ‘System.Las colecciones.Genérica.IEnumerable`1[AW_Internet.Modelos.ProdList]’.
    • editado, tenga en cuenta la modificación a la consulta, utilizando como para cada variable ayudará a EntityFramework que coincida con la salida de la consulta a la Propiedad correcta en el ViewModel
    • Me gustaría poder publicar mi recién editado código. Esto es muy frustrante para mí. Tengo el código exactamente como lo mencionado por usted y que se sigue chocando, con el mensaje de error mencionado en mi último comentario. He intentado cambiando el ViewModel de la clase a IEnumerable tipos de las dos tablas, respectivamente, pero luego se niega a compilar y dice que hay un error en el ‘únete’ Error : El tipo de una de las expresiones de la cláusula join es incorrecta. La inferencia de tipo de error en la llamada a «Unirse»
    • Estoy respondiendo ahora desde mi teléfono… tal vez trate de hacer la llamada SQL sin una clase, es decir, SqlQuery(consulta) entonces la iteración a través de la recopilación devuelta y agregar a cada una vm de la colección.
    • También, una expresión linq no afecta el rendimiento, ya que la expresión se evalúa en una llamada de forma dinámica (que no devuelven datos adicionales)
    • Que podría ser una manera de hacerlo sí, voy a tratar de que. Podría tal vez proporcionan algunas directrices de la iteración y la adición de cada uno a un viewmodel de la colección. Realmente aprecio su ayuda hasta el momento.
    • Yo lo que hice fue simplemente esto: string consulta = «SELECT p.Nombre como el Nombre, la p.ListPrice como ListPrice, a la IZQUIERDA(v. Descripción, 20) como la Descripción de SalesLT.vProductAndDescription v, SalesLT.Producto p DONDE v. ProductID = p.Idproducto»; var viewModel = db.La base de datos.SqlQuery<ProdList>(consulta); return View(viewModel);
    • Pregunta, ¿hay una manera de tener una página de Detalles asociados con esta costumbre viewmodel? Es difícil a causa de las necesidades de la ProductID pasado, pero cuando me incrustar un actionlink para los detalles de todos los productID son cero parece. Cómo voy a ir yo acerca de la codificación de eso? Otra consulta personalizada donde puedo especificar el ProductID como el registro seleccionado?
    • Creo que si usted necesita el productID, usted debería ser capaz de añadir un parámetro en el viewmodel y a incluir en su consulta
    • Cómo puedo utilizar el que con el .Find(id); función para devolver los registros relevantes de detalles? Como es normal con el ActionResult Detalles de la función.

Dejar respuesta

Please enter your comment!
Please enter your name here