Entity Framework - Auswahl bestimmter Spalten
Habe ich eine erfolgreiche Abfrage, links zwei Tabellen mit einer where und orderby-Klausel, aber ich wollte noch hinzufügen, wählen Sie nur bestimmte Spalten, anstatt alles wieder zurück.
TEIL 1
Wenn ich versuche, bekomme ich syntax Fehler auf die orderby-Linie, wenn ich entfernen Sie die orderby-Zeile der syntax-Fehler zu bewegen, um die where-Zeile.
Fehler 3 kann Nicht implizit konvertiert Typ 'System.Linq -.IOrderedQueryable' zu 'System.Linq -.IQueryable'. Eine explizite Konvertierung vorhanden ist (fehlt ein cast?)
IQueryable<VendorProfile> query = _db.VendorProfiles
.Include("VendorCategories")
.Include("VendorsSelected")
.Select(s => new { s.ProfileID, s.Name, s.CompanyName, s.City, s.State, s.DateCreated, s.VendorsSelected, s.VendorCategories })
.Where(x => x.VendorsSelected.Select(s => s.UserName).Contains(HttpContext.Current.User.Identity.Name))
.OrderBy(x => x.DateCreated);
if (criteria.name != string.Empty)
query = query.Where(v => v.Name.Contains(criteria.name));
if (criteria.company != string.Empty)
query = query.Where(v => v.CompanyName.Contains(criteria.company));
if (criteria.startDate != null && criteria.endDate != null)
query = query.Where(v => v.DateCreated > criteria.startDate && v.DateCreated < criteria.endDate);
if (criteria.categories != null && !criteria.categoryMatchAll)
query = query.Where(v => criteria.categories.AsQueryable().Any(cat => v.VendorCategories.Select(vendCat => vendCat.CategoryID).Contains(cat)));
if (criteria.categories != null && criteria.categoryMatchAll)
query = query.Where(v => criteria.categories.AsQueryable().All(cat => v.VendorCategories.Select(vendCat => vendCat.CategoryID).Contains(cat)));
if (criteria.minorityType != null)
query = query.Where(v => v.MinotiryOwned == criteria.minorityType);
if (criteria.diversityClass != null)
query = query.Where(v => v.DiversityClassification == criteria.diversityClass);
return query.ToList();
TEIL 2
Ich wollte auch wissen, ob ich extrahieren Sie die ausgewählten Spalten in einer view-model-Klasse, so dass ich müde dieser und ich bekomme die gleichen Ergebnisse wie oben auf dem orderby-line
Fehler 4 kann Nicht implizit konvertiert Typ 'System.Linq -.IOrderedQueryable' zu 'System.Linq -.IQueryable'. Eine explizite Konvertierung vorhanden ist (fehlt ein cast?)
var
statt IQueryable<VendorProfile>
?nicht sicher, ob ich kann, es gibt mehrere selektive where-Klauseln, die Folgen, die Abfrage (Hinzugefügt OP). Können Sie schlagen eine andere praktikable Lösung zu den oben genannten code?
warum? var nur lässt der compiler zu schließen, die richtige Art, wenn Sie den Typ explizit und der Typ ist nicht gültig nach dem, was Sie zurück. Sie können bewegen Sie den Mauszeiger über
var
um zu sehen, was der Typ wirklich ist. Derzeit ist es so, wie wenn Sie hatte eine Funktion, die zurückgibt, byte, sondern Sie zugewiesen das Ergebnis in string-variable ( string myVal = GetByte();
), wenn Sie var myVal = GetByte();
der compiler wissen, dass myVal
werden sollte, byte und kompilieren Sie es in eine byte-variable. In anderen Worten: zur Laufzeit wird es immer stark typisiert, aber zur compile-Zeit, die Sie Fragen Sie den compiler, die Drecksarbeit zu machen.wenn ich es var allem die where-Klauseln oben geben "Eine explizite Konvertierung vorhanden ist, fehlt einem Guss"
Vielleicht wollen Sie sich das Teil ANTWORT für eine Antwort und markieren Sie es als angenommen?
InformationsquelleAutor SQLGrinder | 2013-03-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
ANTWORT
Ich glaube, Sie hat mir geholfen, stolpern die Tatsache, dass die Typen nicht übereinstimmen. Machen die IQueryable-Typ und wählen Sie neu geben und den Rückgabetyp der GLEICHEN macht der syntax glücklich. Mit var nicht mag.
InformationsquelleAutor SQLGrinder
Ersten Beispiel erfordert
var
weil Sie die Veränderung der Form der Abfrage durch Projektion in anonymen Typ. Das zweite Beispiel kann entwedervar
oderIQueryable<VendorProfileViewModel>
weil Sie die Veränderung der Form der Abfrage durch Projektion inVendorProfileViewModel
.Aber Sie haben noch
IQueryable<VendorProfileViewModel>
. Wenn ein view-Modell enthält die Felder, die Sie verwenden in der where-Klausel sollte nur funktionieren.Ich glaube, Sie hat mir geholfen, stolpern die Tatsache, dass die Typen nicht übereinstimmen. Machen die IQueryable-Typ und wählen Sie neu geben Sie VendorProfileViewModel macht die syntax glücklich. Mit var nicht mag. Aber noch immer Probleme mit der Rückgabe der view-Seite.
InformationsquelleAutor Ladislav Mrnka