une arborescence d'expression lambda ne peut pas contenir une valeur null à la propagation de l'opérateur
Question: La ligne price = co?.price ?? 0,
dans le code suivant me donne l'erreur ci-dessus. mais si je supprime ?
de co.?
il fonctionne très bien. J'essayais de suivre cette MSDN exemple où ils sont à l'aide de ?
sur la ligne select new { person.FirstName, PetName = subpet?.Name ?? String.Empty };
il me semble que j'ai besoin de comprendre quand utiliser ?
avec ??
et quand ne pas.
Erreur:
une arborescence d'expression lambda ne peut pas contenir une valeur null à la propagation de l'opérateur
public class CustomerOrdersModelView
{
public string CustomerID { get; set; }
public int FY { get; set; }
public float? price { get; set; }
....
....
}
public async Task<IActionResult> ProductAnnualReport(string rpt)
{
var qry = from c in _context.Customers
join ord in _context.Orders
on c.CustomerID equals ord.CustomerID into co
from m in co.DefaultIfEmpty()
select new CustomerOrdersModelView
{
CustomerID = c.CustomerID,
FY = c.FY,
price = co?.price ?? 0,
....
....
};
....
....
}
Merci de poster l'erreur...
L'homme que je souhaite C# pris en charge ce!
L'homme que je souhaite C# pris en charge ce!
OriginalL'auteur nam | 2017-06-21
Vous devez vous connecter pour publier un commentaire.
L'exemple que vous avez été en citant utilise LINQ to Objects, où l'implicite des expressions lambda dans la requête sont convertis en délégués... alors que vous êtes à l'aide de EF ou similaire, avec
IQueryable<T>
queryies, où les expressions lambda sont convertis en des arbres d'expression. Des arbres d'Expression ne supportent pas la valeur null opérateur conditionnel (ou tuples).Viens de le faire à l'ancienne:
(Je crois que le null-coalescence de l'opérateur est bien dans une arborescence d'expression.)
OriginalL'auteur Jon Skeet
Le code que vous avez un lien pour les utilisations
List<T>
.List<T>
implémenteIEnumerable<T>
mais pasIQueryable<T>
. Dans ce cas, la projection est exécuté en mémoire et?.
œuvres.Vous utilisez certains
IQueryable<T>
, qui fonctionne très différemment. PourIQueryable<T>
, une représentation de la projection est créé, et votre fournisseur LINQ décide quoi faire avec elle au moment de l'exécution. Pour des raisons de rétro-compatibilité,?.
ne peut pas être utilisé ici.En fonction de votre fournisseur LINQ, vous pouvez être en mesure d'utiliser tout simplement
.
et toujours pas obtenir quelqueNullReferenceException
.Tous les fournisseurs LINQ qui avait déjà été créé avant l'introduction de
?.
n'aurait pas été préparés à gérer les?.
en aucune façon raisonnable.Mais le
?.
est un nouvel opérateur non? Si l'ancien code ne serait pas utiliser?.
et donc ne pas être brisé. Linq Fournisseurs ne sont pas préparés à gérer beaucoup d'autres choses telles que les méthodes CLR.Droit, de l'ancien code en combinaison avec d'anciens fournisseurs LINQ ne seraient pas touchés. Ancien code ne sera pas à l'aide de
?.
. Nouveau code peut être à l'aide de vieux LINQ fournisseurs, qui préparés à gérer les méthodes CLR ils ne reconnaissent pas (par la levée d'une exception), puisque celles-ci s'intégrer parfaitement dans l'expression existante objet de l'arborescence du modèle. Complètement nouvelle expression nœud de l'arborescence des types ne correspondent pas.OriginalL'auteur