Linq-extension-Methode
Ich Häufig zu begrenzen Wählt durch Felder wie publishStart
, publishEnd
, active
Habe ich diese Felder in verschiedenen Tabellen. So werden nur die Zeilen ausgewählt werden sollte, sind
a: active == true;
b: publishStart < now;
c: publishEnd > now;
So, zum Beispiel:
db.myTable.SingleOrDefault(a => (a.ID == _theID
//now the active and start-end part:
&& ((a.publishEnd > DateTime.Now) || (a.publishEnd == null))
&& ((a.publishStart <= DateTime.Now) || (a.publishStart == null))
&& a.active == true));
Dies ist etwas langatmig, so dass ich Frage mich, ob es möglich ist, zu erstellen (Erweiterung?)-Methode wie:
db.myTable.SingleOrDefault(a => (a.ID == _theID).isActive()
wo die isActive()
bietet die 3 Zeilen in der obigen Schnipsel.
Wie könnte ich dies tun?
Gibt es einen besseren Weg, um clean-up-code?
- Diese sind alle in separaten Tabellen, richtig? Nicht eine einzige Tabelle, die ausgesetzt ist, die durch den Kontext? Ich Frage, weil Sie angeben, in der Präambel, dass die Eigenschaften sind auf separaten Tabellen, die bei der Verwendung von nur einem Kontext in den filter. Wenn Sie alle auf die gleiche Tabelle, es ist einfach, wenn Sie sich auf unterschiedlichen Tabellen, verändert Sie die richtige Antwort ungemein.
- In diesem Fall würden Sie benötigen, rufen Sie
IsActive
vorSingleOrDefault
so dass Sie können filter der aktiven Elemente, bevor Sie nur eine, es sei denn, es ist immer nur ein Element mit der entsprechenden ID.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Definieren, eine Erweiterung, die Sie brauchen eine statische Klasse. Sie können diese in beliebiger namespace, die Sie wollen, nur denken Sie daran, es in Ihr aufzuhalten der Benutzung.
Bemerken
YourEntityType
dort. Dieser wird verwendet um sicherzustellen, dass die Methode Kenntnis von der ExistenzpublishStart
,publishEnd
, undactive
. Dies sollte entweder in der Klasse, die diese Felder oder einen Vertrag (interface), die Sie definiert.Würden Sie dann nennen das so:
Mehr auf Erweiterung Methoden hier: http://msdn.microsoft.com/en-us/library/bb383977.aspx
Da es viele Kommentare aufspringen alle über dem Platz, ich werde fügen Sie hier eine kurze Erklärung der interface-Lösung...
Es ist unklar in der Frage, ob oder nicht es ist eine Allgemeine Implementierung für die drei gefilterten Felder oder eine Schnittstelle zu definieren. Wenn nicht, für die oben genannten arbeiten, werden Sie nicht entweder:
YourEntityType
mitYourBaseEntityType
.YourEntityType
mitIYourContract
.IQueryable<T>
stattIEnumerable<T>
?SingleOrDefault
was der OP fordert.IQueryable<T>
wie ich habe Polymorphismus in der Vergangenheit Probleme mitIEnumerable<T>
. Da gibt es Erweiterungen für beideIEnumerable<T>
undIQueryable<T>
, die eineIEnumerable<T>
führen kann, in die falschen Erweiterungen genannt werden, die weiter in der Kette, wodurch die Aufzählung eher als latente Abfragen.Active
Methode selbst. Beachten Sie diethis
Stichwort, indem der erste parameter. Einstatic
Methode in einerstatic
Klasse kann gemacht werden in eine extension-Methode durch hinzufügenthia
auf den ersten parameter. Das heißt, Sie können rufen Sie die statische Methode als ob es ist ein - Instanz-Methode der erste parameter. Ich habe einen link zu meiner Antwort zum weiteren Lesen.Nur definieren Sie eine Schnittstelle wie diese
und fügen Sie alle relevanten Klassen.
Nun können Sie mit dieser Erweiterung Methode
auf jeder Instanz die
IHaveAActivityPeriod
.Ich völlig verpasst die Möglichkeit zu konstruieren, die eine Erweiterung Methode, die die Filterung der Sequenz anstatt sich auf eine einzelne Person auf einmal. Nimm einfach die extension-Methode von flem Antwort ein Wurf in die Schnittstelle, wie Typ-Einschränkung.