2016-07-06 10 views
0

Ich versuche, eine Linq-Abfrage für eine meiner Dashboard, die Daten basierend auf einigen Bedingungen abruft. Ich möchte die Anzahl der Datensätze basierend auf dem in meiner Tabelle verfügbaren Status anzeigen.Gruppierung auf virtuelle (vordefinierte) Spalte in linq

Folgendes ist die SQL-Abfrage, in der ich versuche, in Linq zu konvertieren.

select count(id) cnt, 'Available' label from table where date = sysdate 

Die obige Abfrage gibt das Ergebnis unter DB IDE zurück. Dies ist das Ergebnis, das ich mit Linq will

cnt label 
0  Available 

Ich habe versucht, mit folgenden Linq-Abfrage, aber es kehrt 0 Zahl und somit zur Folge haben wird, nicht abgerufen werden.

var data = (from a in context 
where a.date = System.DateTime.Now 
group a in a.id into g 
select new { 
cnt = g.Count(), 
label = 'Available' 
}).ToList(); 

Wie erreiche ich oben genannten Ergebnis in linq. Ihre Hilfe wird geschätzt.

Dank

------------- ---------------- EDIT aktualisiert LINQ-Abfrage

var data = (from a in context.TableA 
where a.id = uniqueID 
group a in a.id into g 
select new { 
cnt = g.Count(), 
label = 'Available' 
}).Concat(from a in context.TableB 
where a.id = uniqueID 
group a in a.id into g 
select new { 
cnt = g.Count(), 
label = 'WIP' 
}).ToList(); 
+1

Sie haben keine Where-Klausel auf Ihrer SQL-Abfrage, aber dann in Ihrem Linq, und ich bezweifle, dass Ihre Tabellen Datum Spalte ist die gleiche wie die aktuelle DateTime.Now (Ich kann garantieren, ist es nicht). Entferne das 'wo' von deiner linq. – Dispersia

+0

Möchten Sie die Anzahl der Elemente in Daten mit einer bestimmten ID zählen oder die Anzahl der eindeutigen IDs in Daten zählen? –

+0

@Dispersia - Ich habe die SQL-Abfrage aktualisiert. Bitte beziehen Sie sich auf eine aktualisierte. Trotzdem gibt es 1 Zeile in der DB IDE zurück, aber nicht mit linq. FYI, ich brauche das, wo Bedingung für das Filtern des Ergebnisses. Danke – user968441

Antwort

2

Um die Anzahl der Elemente zählen ein Prädikat in einer Linq-Abfrage verwenden Sie einfach die where Klausel übereinstimmt, gefunden

var results = 
    from a in context 
    where a.date.Date == DateTime.Now.Date 
     && a.id == someIdHere 
    select a; 

var data = new { 
    count = results.Count(), 
    label = "Available" 
}; 

Oder in Extension-Methode Syntax (die ich bevorzugen):

var results = context.Where(a => a.date.Date == DateTime.Now.Date && a.id == someIdHere); 

var data = new { 
    count = results.Count(), 
    label = "Available" 
}; 

auch vorsichtig sein, wenn ein DateTime Objekt in Bezug auf den Vergleich, welche Ergebnisse Sie wünschen; Vergleicht man DateTime.Now mit einem Datum, wird auch false zurückgegeben, da auch der Zeitcode verglichen wird. Verwenden Sie die Eigenschaft DateTime.Date, um nur das Datum vom Objekt zu Vergleichszwecken zu erhalten.

+0

Danke für die Antwort. Wenn Sie den LINQ- und Lambda-Ausdruck betrachten, sollte es wie erwartet funktionieren, aber wir können dies nicht in einer einzelnen Abfrage herausbringen. Eigentlich habe ich die "Concat" -Erweiterungsmethode in linq verwendet, um mein Ergebnis auf einem anderen Label zu erhalten, und daher versuche ich eine einzelne Linq, die die Anzahl der Datensätze basierend auf verschiedenen Labels angibt. – user968441

+0

Es mag zwar möglich sein, aber ich würde es vermeiden, alles zu komplizieren, indem ich alles in eine einzige Abfrage zwinge; Der Wunsch, alles in große Aussagen zu fassen, führt meiner Erfahrung nach zu einem nicht mehr zu erhaltenden Code. Bitte denken Sie daran, dies als eine Antwort zu markieren, wenn es Ihre Frage beantwortet. –

+0

Ja, ich verstehe, dass es eine komplizierte linq sein kann, aber anstelle von mehreren DB-Reisen würde ich vorschlagen, eine einzige Abfrage zu haben, die ganze Daten basierend auf dem Vorschlag abruft und daher diesen Ansatz hat. Ich würde nicht mit "nicht zu erhaltendem Code" übereinstimmen, wenn wir die Aggregationslogik mit LINQ verbinden. Es hängt davon ab, wie Sie linq und Logik schreiben, die Sie verwalten möchten.Siehe Ich habe meine Frage mit "Concat" -Aussage aktualisiert. Danke – user968441