Frage

Überspringen Sie nach Bedarf zur "spezifischen Frage". Ein Hintergrund:

Das Szenario: Ich habe eine Reihe von Produkten mit einem "Bohrer -Down" -Filter (Query -Objekt) mit DDLs. Jede progressive DDL -Auswahl begrenzt die Produktliste sowie die Optionen für die DDLs weiter. Die Auswahl eines Hammers aus Werkzeugen begrenzt beispielsweise die Produktgrößen, um nur Hammergrößen anzuzeigen.

Aktuelles Setup: Ich habe ein Abfrageobjekt erstellt, es an ein Repository gesendet und jede Option an eine SQL -Tabelle bewertet, in der Nullwerte "alle Produkte erhalten" darstellen.

Ich halte dies für eine gute Anstrengung, aber weit entfernt von DDD akzeptabel. Ich möchte jede "Programmierung" in SQL vermeiden und hoffentlich alles mit einem Repository machen. Kommentare zu diesem Thema wären geschätzt.

Spezifische Frage:

Wie würde ich diese Abfrage als umschreiben Dynamische Abfrage? Ein Link zu so etwas wie 101 Linq Beispiele wäre fantastisch, aber mit einem dynamischen Abfragebereich. Ich möchte wirklich an diese Methode übergeben, das Feld in Zitaten "", für das ich eine Liste von Optionen wünsche und wie viele Produkte diese Option haben.

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

Jede DDL -Option hat "die Auswahl (21)", wobei die (21) die Menge der Produkte ist, die dieses Attribut haben. Bei der Auswahl einer Option aktualisieren alle anderen verbleibenden DDLs mit den verbleibenden Optionen und Zählungen.

Bearbeiten: Zusätzliche Hinweise:

.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

Was ich bisher gelernt habe, ist Linqpad ist fantastisch, aber immer noch nach einer Antwort. Schließlich wird eine völlig zufällige Forschung wie diese vorherrschen, denke ich. LOL.

Bearbeiten:

Jon Skeet hatte eine fantastische Idee: Besetzen Sie das, was ich brauche als IGrouping<string, Product>. Vielen Dank an Jon Skeet! Sobald Sie das Objekt gegossen haben, können Sie über die Sets aufgezählt und die Ergebnisse in eine separate Liste versorgen.

War es hilfreich?

Lösung

Ich bin mir nicht sicher, wie ich mithilfe der Abfrage -Syntax (wie oben) dies tun soll, aber mithilfe der Methodensyntax können wir einen Ausdruck verwenden

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

Andere Tipps

Wenn Sie sich ansehen C# Bits, Der Autor erörtert, wie Kaskadierungsfilter mit dynamischen Daten erstellt werden. Es klingt nicht so, als würden Sie dynamische Daten verwenden, aber er hat einen schönen Ausdrucksbauer, der Ihnen möglicherweise hilfreich ist. Siehe BuildQueryBody und dann den folgenden Abschnitt der Erweiterungsmethoden auf iQueryable.

Da Sie keine dynamischen Daten verwenden, müssen Sie sich nicht mit dem Zugriff auf ein "MetaforeignkeyColumn" -Objekt befassen, aber ich vermute, sein Ansatz könnte Ihnen bei Ihrer Frage helfen.

Ich hoffe das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top