Wie Wende ich die LINQ to SQL-Distinct-operator() verwendet, um einen List<T>?
Ich habe ein ernsthaftes(es ist schon mich verrückt) problem mit LINQ to SQL. Ich bin die Entwicklung einer ASP.NET MVC3-Anwendung mit c# und Razor in Visual Studio 2010.
Habe ich zwei Datenbank-Tabellen, Produkt und Kategorien:
Produkt(Prod_Id[primary key], andere Attribute)
Kategorien((Dept_Id, Prod_Id) [Primärschlüssel], andere Attribute)
Offensichtlich Prod_Id in Kategorien ist ein Fremdschlüssel. Beide Klassen zugeordnet sind, die mit dem Entity Framework (EF). Ich habe nicht erwähnt, der Kontext der Anwendung für Einfachheit.
In Kategorien gibt es mehrere Zeilen mit den Prod_Id. Ich möchte eine Projektion aller Verschiedene Prod_Id in Kategorien. Ich habe es mit Normalpapier (T)SQL, die in SQL Server MGMT Studio nach dieser (wirklich einfache) Abfrage:
SELECT DISTINCT Prod_Id
FROM Categories
werden und das Ergebnis korrekt ist. Jetzt muss ich diese Abfrage in meine Bewerbung, damit ich verwendet:
var query = _StoreDB.Categories.Select(m => m.Prod_Id).Distinct();
Ich gehe, um zu überprüfen, das Ergebnis meiner Abfrage mit:
query.Select(m => m.Prod_Id);
oder
foreach(var item in query)
{
item.Prod_Id;
//other instructions
}
und es funktioniert nicht. Zunächst die Intellisense, wenn ich Versuch zu schreiben query.Select(m => m.
oder item.
zeigt nur Vorschläge über die Methoden (wie z.B. Gleich, etc...) und nicht Eigenschaften. Ich dachte, dass vielleicht gab es etwas falsch mit Intellisense (ich denke, die meisten von Ihnen viele Male gehofft, dass Intellisense falsch war :-D) aber wenn ich die Anwendung starten, erhalte ich eine Fehlermeldung zur Laufzeit.
Bevor Sie Ihre Antwort im Hinterkopf behalten, dass:
1) überprüfte ich viele Foren habe ich versucht, den normalen LINQ to SQL (ohne Verwendung von Lambda-Ausdrücke), aber es funktioniert nicht. Die Tatsache, dass es funktioniert, (T)SQL bedeutet, dass es etwas falsch mit der LINQ to SQL-Anweisung (andere Abfragen in meiner Anwendung funktioniert perfekt).
2) Für die Anwendung bedingt, habe ich ein List<T>
variable statt _StoreDB.Kategorien und ich dachte, das war das problem. Wenn Sie bieten mir eine Lösung ohne Verwendung eines List<T>
ist geschätzt als gut.
Dank für Eure Antworten
Francesco
Grund, warum Sie nicht bekommen, intellisense ist, weil Sie nur auswählen eine Spalte (ich denke, es ist ein string oder int), so werden Sie nur die Eigenschaften der Spalte Typ.
Welche Fehlermeldung bekommst du und wie bist du dazu gekommen, dass Distinct() nicht funktioniert, poste bitte den code
ja, du hast Recht! Es gibt einfach eine Liste von int. Und wenn ich möchte diese Liste für eine Verknüpfung?
welche Fehlermeldung erhalten Sie?
InformationsquelleAutor CiccioMiami | 2011-04-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Zeile:
Ihre LINQ-Abfrage wahrscheinlich gibt IEnumerable...
ints
(Beurteilung durchSelect(m => m.Prod_Id)
). Sie haben die Liste von Integer-zahlen, keine Liste von Person-Objekten. Versuchen Sie, drucken Sie und sehen Sie, was Sie bekam.Wenn Sie die Auswahl der gesamten Einheit können Sie nur
_StoreDB.Categories.Distinct()
Aufruf.Select(m => m)
redundant ist.Ich Rede unter Bezugnahme auf das Prod_id nach 'var query = _StoreDB.Kategorien.Wählen Sie ein(m => m ist.Prod_Id).Distinct();' ausgeführt wird. Zum Beispiel " Abfrage.Wählen Sie ein(m => m)' wählen Sie den Prod_Id
InformationsquelleAutor k.m
Aufrufen
_StoreDB.Categories.Select(m => m.Prod_Id)
bedeutet, dassquery
enthaltenProd_Id
Werte nur, nicht die gesamte Einheit. Es wäre in etwa äquivalent zu dieser SQL, wählt die nur in einer Spalte (anstatt der gesamten Zeile):Also, wenn Sie Durchlaufen
query
mitforeach (var item in query)
, die Art deritem
ist wahrscheinlichint
(oder was auch immer IhrProd_Id
Spalte), nicht Ihre Person. Das ist, warum Intellisense nicht in die entity-Eigenschaften, die Sie erwarten, wenn Sie geben Sie "item.
"...Wenn Sie möchten, dass alle Spalten in
Categories
enthaltenquery
Sie nicht sogar brauchen, zu verwenden.Select(m => m)
. Sie können nur dazu:Beachten Sie, dass, wenn Sie nicht ausdrücklich pass ein
, IEqualityComparer<T>
zuDistinct()
,EqualityComparer<T>.Default
verwendet werden (die möglicherweise oder möglicherweise nicht so Verhalten, wie Sie es haben wollen, je nach der Art derT
, ob oder nicht es implementiertSystem.IEquatable<T>
, etc.).Weitere Infos über die Anreise
Distinct
arbeiten in ähnlichen Situationen wie deine, werfen Sie einen Blick auf diese Frage oder diese Frage und die damit verbundenen Diskussionen.InformationsquelleAutor Donut
Wie bereits von den anderen Antworten, der Fehler, dass die OP lief in war, weil das Ergebnis seiner Arbeit war eine Sammlung von int-Werten, nicht eine Sammlung von Kategorien.
Was nicht beantwortet wurde war seine Frage, wie die Sammlung von int-Werten in einem join oder so, um zu bekommen, an einige nützliche Daten. Ich werde versuchen zu tun, dass hier.
Nun, ich bin mir nicht wirklich sicher, warum der OP wollte eine unterschiedliche Liste von Prod_Ids von Kategorien, anstatt nur immer die Prod_Ids von Projekten. Vielleicht wollte er herausfinden, welche Produkte sind in Bezug auf eine oder mehrere Kategorien, damit etwaige nicht Kategorisierte Produkte sind ausgeschlossen aus den Ergebnissen. Ich nehme an dies ist der Fall, und dass das gewünschte Ergebnis ist eine Sammlung von verschiedenen Produkten, die zugeordneten Kategorien. Ich werde erstmal Antwort auf die Frage, was mit den Prod_Ids zuerst, und dann einige alternativen anzubieten.
Können wir die Sammlung von Prod_Ids genau so, wie Sie erstellt wurden, in der Frage, wie eine Abfrage:
Dann würden wir verwenden Sie, etwa so:
Dieser führt die Abfrage, tritt es mit der Products-Tabelle, gibt die Schlüssel zu verwenden, und schließlich sagt Sie das Produkt zurücksenden Einheit von der jeweils passende Satz. Weil wir wissen, dass die Prod_Ids in der Abfrage eindeutig sind (wegen Distinct()) und die Prod_Ids in Produkten, die einzigartig sind (per definition, denn es ist der primäre Schlüssel), wissen wir, dass die Ergebnisse eindeutig werden die zimmerreserviereung, ohne das zu nennen, Distinct().
Nun, die oben genannten wird man die gewünschten Ergebnisse, aber es ist definitiv nicht das sauberste oder einfachste Weg, es zu tun. Wenn die Kategorie von Entitäten definiert sind, mit einer relationalen Eigenschaft liefert den zugehörigen Datensatz aus Produkte (die würde wahrscheinlich Product), der einfachste Weg, das zu tun, was wir versuchen zu tun, wäre die folgende:
Bekommt dieser das Produkt aus jeder Kategorie, und gibt einen deutlichen Sammlung von Ihnen.
Wenn die Kategorie Person hat nicht das Produkt, relationale Eigenschaft, dann können wir gehen zurück, um mit der Join-Funktion verwenden, um unsere Produkte.
Schließlich, wenn wir nicht nur wollen, eine einfache Auflistung von Produkten, dann einige mehr, aber müsste gehen, in diesem und vielleicht die einfachste Sache wäre, zu behandeln, die bei der Iteration über die Produkte. Ein weiteres Beispiel wäre, für immer ein count für die Anzahl der Kategorien auf jedem Produkt gehört. Wenn das der Fall ist, würde ich die Logik umzukehren und starten Sie mit Produkten, etwa so:
Dies hätte zur Folge, eine Sammlung von anonym typisierte Objekte, die sich auf das Produkt und die NumberOfCategories Bezug auf das Produkt. Wenn wir noch erforderlich, um auszuschließen uncatorized Produkte, wir könnten anfügen
.Where(r => r.NumberOfCategories > 0)
vor dem Semikolon. Natürlich, wenn der Product-Entität definiert ist, mit einer relationalen Eigenschaft für die Verwandte Kategorien würden Sie nicht brauchen diese, denn Sie könnten nur nehmen Sie ein Produkt und machen Sie das folgende:Eh, sorry für das abschweifen. Ich hoffe, dies beweist hilfreich, um jemand anderes, das läuft in ein ähnliches Problem. 😉
InformationsquelleAutor CptRobby