Pergunta

Pule para a "pergunta específica", conforme necessário. Alguns antecedentes:

O cenário: Eu tenho um conjunto de produtos com um filtro "Drill Down" (objeto de consulta) preenchido com DDLs. Cada seleção progressiva do DDL limitará ainda mais a lista de produtos, bem como quais são deixadas as opções para o DDLS. Por exemplo, a seleção de um martelo fora das ferramentas limita os tamanhos do produto para mostrar apenas tamanhos de martelo.

Configuração atual: Criei um objeto de consulta, enviei -o para um repositório e alterei cada opção a uma "função de avaliação da tabela" SQL, onde os valores nulos representam "Get todos os produtos".

Considero isso um bom esforço, mas longe de ser aceitável. Quero evitar qualquer "programação" no SQL, espero fazer tudo com um repositório. Comentários sobre este tópico seriam apreciados.

Pergunta específica:

Como eu reescreveria esta consulta como uma Consulta dinâmica? Um link para algo como 101 Exemplos LINQ Seria fantástico, mas com um escopo de consulta dinâmica. Eu realmente quero passar para esse método o campo nas cotações "" para o qual quero uma lista de opções e quantos produtos têm essa opção.

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

Cada opção DDL terá "a seleção (21)", onde (21) é a quantidade de produtos que possuem esse atributo. Ao selecionar uma opção, todos os outros DDLs restantes serão atualizados com as opções e contagens restantes.

Editar: Notas adicionais:

.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

O que aprendi até agora é Linqpad é fantástico, mas ainda procurando uma resposta. Eventualmente, pesquisas completamente aleatórias como essa prevalecerão, eu acho. LOL.

Editar:

Jon Skeet teve uma ideia fantástica: lançar o que eu preciso como IGrouping<string, Product>. Obrigado a Jon Skeet! Depois de lançar o objeto, você pode enumerar sobre os conjuntos e alimentar os resultados em uma lista separada.

Foi útil?

Solução

Não tenho certeza de como fazer isso usando sintaxe de consulta (como acima), mas usando a sintaxe do método, podemos usar uma expressão

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

Outras dicas

Se você der uma olhada em C# bits, o autor discute como criar filtros em cascata usando dados dinâmicos. Não parece que você está usando dados dinâmicos, mas ele tem um bom construtor de expressões que pode ser útil para você. Consulte BuildQuerybody e, em seguida, a seguinte seção de métodos de extensão no iQueryable.

Como você não está usando dados dinâmicos, você precisará lidar com não ter acesso a um objeto "metaforeignkeycolumn", mas suspeito que a abordagem dele possa ajudá -lo com sua pergunta.

Eu espero que isso ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top