Wie erzeugen anonyme Objekte vom Typ IQueryable mit LINQ
Arbeite ich in einem ASP.NET MVC-Projekt, wo ich haben eine zwei LinqToSQL Klassen. Ich habe auch eine repository-Klasse für die Modelle und ich habe implementiert einige Methoden, wie " LIST, ADD, SPEICHERN in, die Klasse, die dazu dient den controller mit Daten. Nun, in einer der repository-Klassen, die ich gezogen haben einige Daten mit LINQ verbindet wie dieses.
private HerculesCompanyDataContext Company = new HerculesCompanyDataContext();
private HerculesMainDataContext MasterData = new HerculesMainDataContext();
public IQueryable TRFLIST()
{
var info = from trfTable in Company.TRFs
join exusrTable in MasterData.ex_users on trfTable.P_ID equals exusrTable.EXUSER
select new
{
trfTable.REQ_NO,
trfTable.REQ_DATE,
exusrTable.USER_NAME,
exusrTable.USER_LNAME,
trfTable.FROM_DT,
trfTable.TO_DT,
trfTable.DESTN,
trfTable.TRAIN,
trfTable.CAR,
trfTable.AIRPLANE,
trfTable.TAXI,
trfTable.TPURPOSE,
trfTable.STAT,
trfTable.ROUTING
};
return info;
}
Wenn ich jetzt rufe diese Methode von meinem controller, ich bin nicht in der Lage, um eine Liste. Was ich wissen möchte ist, ohne die Erstellung von benutzerdefinierten Daten-model-Klasse wie kann ich ein Objekt zurückgeben, anonymer Typ, wie IQueryable. Und weil das gehört nicht zu einem Daten-Modell wie kann beziehen sich auf diese Liste in der Ansicht.
InformationsquelleAutor Soham Dasgupta | 2010-05-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht zurück, ein Objekt von "anonymous type". Bitte sehen diese vorherigen post von mir, dass diese situation, wo es scheint, dass anonyme Typen erlauben uns zu betrügen ein wenig auf die starke Typisierung, aber das tun Sie nicht.
Ja, das verschieben von flexiblen Typen (wie DataTables) zu stark typisierte Objekte ist ein großer Teil Ihrer Lösung-Strategie. Mit LINQ-To-SQL, sollten Sie in der Lage, ziemlich leicht wieder stark typisierte Entität Objekte. Ihre repository-Methoden zurückkehren müssen explizit eingegeben IQueryable-Schnittstellen,wie
IQueryable<TRF>
, nicht nurIQueryable
. Oder ein repository-Methode konnte gerade wieder einen einzelnenTRF
entity Objekt oder eine Liste dieser Objekte.Beachten Sie, dass anonyme Typen und implizit typisierte Variablen sind zwei sehr verschiedene Dinge. Ein anonymer Typ erstellt, für die dir der compiler hinter den kulissen. In diesem Fall, nicht Ihre Daten in anonymer Art, wie Sie in Ihrem Beispiel von LINQ-Abfragen. Vorausgesetzt, Ihre Einheit ist trfTable, versuchen Sie dies:
Der Vorteil dabei ist, dass es dauert, massive Vorteil der Natur des IQueryable, dass Kriterien Hinzugefügt außerhalb Ihres repository tatsächlich Hinzugefügt werden, um die generierte Abfrage an. Es ist cool. Allerdings es gibt einige gute Debatte darüber, ob dies der beste Weg, es zu tun.
Beachten Sie, dass
info
hier ist implizit typisierte durch den compiler, aber es ist nicht ein anonymer Typ. Es ist einIQuerable<trfTable>
. Dies ist der entscheidende Unterschied.Nein. Der Ausgangspunkt ist ein anderer repository-Klasse für jede Entität. Haben Sie vielleicht 1 "select" - Methode, die Sie haben könnten 8. Idealerweise Ihr "wählen" Methoden nehmen einige Parameter zumindest dafür zu sorgen, dass die Anfragen zumindest teilweise basierend auf einem indizierten Feld. Für eine Diskussion der Abwägung, wie viele Methoden zu haben, siehe auch: stackoverflow.com/questions/2849873/2849944#2849944
InformationsquelleAutor Patrick Karcher
Können Sie Art Rückkehr, eine anonyme Art, nur nicht in einer Weise, die stark typisiert ist. Ich benutze diese Methode zum erstellen von json-serialisierbaren Typen.
Rückkehr eine Art von "Objekt" in Ihren Daten Modell Klasse:
Dann nennen Sie es von Ihrem controller (in diesem Beispiel verwende ich wieder ein JsonResult):
Sie könnte auch prüfen, die Verwendung der neuen dynamischen Typ, wenn Sie in 4.0...
-UPDATE: ich versuchte dies und es funktionierte perfekt-
Rückkehr eine Art von "Objekt" in Ihren Daten Modell Klasse:
InformationsquelleAutor jslatts