Pregunta

Saltar a la "cuestión específica", según sea necesario. Algunos antecedentes:

El escenario: I tiene un conjunto de productos con un filtro (Object consulta) "profundizar" poblado con DDLs. Cada selección DDL progresiva limitará aún más la lista de productos, así como las opciones que se dejan para los DDL. Por ejemplo, la selección de un martillo de herramientas limita los tamaños de los productos a sólo tamaños martillo muestran.

configuración actual: I creó un objeto de consulta, lo envió a un repositorio, y se alimenta cada opción de una "mesa de función con valores", donde los valores nulos representan "obtener todos los productos" SQL

Considero esto un esfuerzo de buena, pero lejos de DDD aceptable. Quiero evitar cualquier "programación" en SQL, es de esperar haciendo todo con un repositorio. Comentarios sobre este tema serán bienvenidos.

Cuestión específica:

¿Cómo voy a volver a escribir esta consulta como un consulta dinámica ? Un enlace a algo así como 101 Ejemplos Linq sería fantástico, pero con alcance una consulta dinámica. Realmente quiero pasar a este método el campo entre comillas "" por lo que quiero una lista de opciones y cuántos productos tiene esa opción.

from   p in db.Products
group  p by p.ProductSize into g
select new Category { 
       PropertyType = g.Key,
       Count = g.Count() }

Cada opción DDL tendrá "La selección (21)", donde el (21) es la cantidad de productos que tienen ese atributo. Al seleccionar una opción, todas las demás DDLs restantes se actualizarán con los restantes opciones y recuentos.

Editar: Notas adicionales:

.OrderBy("it.City") // "it" refers to the entire record
.GroupBy("City", "new(City)") // This produces a unique list of City
.Select("it.Count()") //This gives a list of counts... getting closer
.Select("key") // Selects a list of unique City
.Select("new (key, count() as string)") // +1 to me LOL.  key is a row of group
.GroupBy("new (City, Manufacturer)", "City") // New = list of fields to group by
.GroupBy("City", "new (Manufacturer, Size)") // Second parameter is a projection

Product
.Where("ProductType == @0", "Maps")
.GroupBy("new(City)", "new ( null as string)")// Projection not available later?
.Select("new (key.City, it.count() as string)")// GroupBy new makes key an object

Product
.Where("ProductType == @0", "Maps")
.GroupBy("new(City)", "new ( null as string)")// Projection not available later?
.Select("new (key.City, it as object)")// the it object is the result of GroupBy

var a = Product
        .Where("ProductType == @0", "Maps")
        .GroupBy("@0", "it", "City") // This fails to group Product at all
        .Select("new ( Key, it as Product )"); // "it" is property cast though

Lo que he aprendido hasta ahora es LINQPad es fantástica, pero todavía en busca de una respuesta. Con el tiempo, la investigación completamente al azar como ésta prevalecerá supongo. LOL.

Editar

Jon Skeet tenía una idea fantástica: fundido lo que necesito como IGrouping<string, Product>. Gracias a Jon Skeet! Una vez que lances el objeto, puede enumerar lo largo de los conjuntos y alimentar a los resultados en una lista separada.

¿Fue útil?

Solución

No estoy seguro de cómo hacer esta sintaxis de consulta utilizando (como antes), pero utilizando la sintaxis del método, podemos usar una expresión

using System;
using System.Linq;
using System.Linq.Expressions;

namespace LinqResearch
{
    public class Program
    {
        [STAThread]
        static void Main()
        {
            string columnToGroupBy = "Size";

            // generate the dynamic Expression<Func<Product, string>>
            ParameterExpression p = Expression.Parameter(typeof(Product), "p");

            var selector = Expression.Lambda<Func<Product, string>>(
                Expression.Property(p, columnToGroupBy),
                p
            );

            using (LinqDataContext dataContext = new LinqDataContext())
            {
                /* using "selector" caluclated above which is automatically 
                compiled when the query runs */
                var results = dataContext
                    .Products
                    .GroupBy(selector)
                    .Select((group) => new { 
                        Key = group.Key, 
                        Count = group.Count()
                    });

                foreach(var result in results)
                    Console.WriteLine("{0}: {1}", result.Key, result.Count);
            }

            Console.ReadKey();
        }
    }
}

Otros consejos

Si se echa un vistazo a C # Bits , los discute autor cómo crear filtros en cascada utilizando datos dinámicos. No suena como que está utilizando datos dinámicos, pero tiene un buen generador de expresiones que podrían ser de utilidad para usted. Ver BuildQueryBody, y luego la siguiente sección de métodos de extensión en IQueryable.

Dado que no está utilizando datos dinámica, tendrá que hacer frente a no tener acceso a un objeto "MetaForeignKeyColumn", pero sospecho que su acercamiento que podría ayudarle con su pregunta.

Espero que esto ayude.

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