Entity Framework - la Sélection des colonnes spécifiques
J'ai une requête réussie qui relie les deux tables avec un où et orderby clause, mais je voulais ajouter à il suffit de sélectionner des colonnes spécifiques au lieu d'obtenir tout retour.
PARTIE 1
Lorsque je tente cela je reçois des erreurs de syntaxe sur le orderby ligne, si je retire la orderby ligne les erreurs de syntaxe déplacer à l'endroit où la ligne.
Erreur 3 Ne peut pas convertir implicitement le type de Système.Linq.IOrderedQueryable' à 'Système.Linq.IQueryable'. Une conversion explicite existe (vous manque un plâtre?)
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();
PARTIE 2
Je voulais aussi savoir si je pouvais extraire les colonnes sélectionnées dans un modèle de vue de classe, j'ai donc fatigué et je obtenir les mêmes résultats que ci-dessus sur la orderby ligne
Erreur 4 Impossible de convertir implicitement le type de Système.Linq.IOrderedQueryable' à 'Système.Linq.IQueryable'. Une conversion explicite existe (vous manque un plâtre?)
- utilisation
var
au lieu deIQueryable<VendorProfile>
? - pas sûr que je peux, il y a plusieurs sélectif où l'une des clauses qui suivent la requête (ajouté à l'OP). Pouvez-vous suggérer une autre solution viable pour le code ci-dessus?
- pourquoi? var laisse le compilateur de déduire le type correct si vous définissez le type de manière explicite et le type n'est pas valable en fonction de ce que vous retourner. Vous pouvez passer la souris sur
var
pour voir ce que le type est vraiment. Actuellement c'est comme si vous aviez une fonction qui renvoie l'octet mais vous affecter le résultat à une variable de chaîne (string myVal = GetByte();
) si vous utilisezvar myVal = GetByte();
le compilateur sait quemyVal
doit être byte et le compiler pour être une variable d'octet. En d'autres termes à l'exécution, il sera toujours fortement typé, mais au moment de la compilation vous demander au compilateur de faire le sale travail. - si je le fais, var tous les où l'une des clauses ci-dessus donnent "Une conversion explicite existe vous manque un cast"
- Peut-être que vous voulez déplacer la partie RÉPONSE pour la réponse et le marquer comme acceptée?
- fait, mais je ne peux pas accepter ma propre réponse. J'espère que certains LINQ expert peut m'aider, ce post
- S'il vous plaît, pourriez-vous clairement ce problème est de gauche alors?
- le nouveau problème a été posté ici
Vous devez vous connecter pour publier un commentaire.
RÉPONSE
Je pense que vous m'avez aidé à tomber sur le fait que les types ne correspondent pas. Faire le IQueryable type et sélectionnez de nouveau type et le type de retour de la MÊME rend la syntaxe heureux. À l'aide de la var n'aime pas.
Le premier exemple nécessite
var
parce que vous êtes en changeant la forme de la requête en les projetant dans un type anonyme. Le deuxième exemple, on peut soit utiliservar
ouIQueryable<VendorProfileViewModel>
parce que vous êtes en changeant la forme de la requête en les projetant dansVendorProfileViewModel
.IQueryable<VendorProfileViewModel>
. Si le modèle de vue contient les champs que vous utilisez dans les clauses where il devrait fonctionner.