une expression tree lambda ne peut pas contenir un opérateur de propagation nul.

Question: La ligne price = co?.price ?? 0, dans le code suivant me donne l'erreur ci-dessus. mais si je supprime ?co.? ça marche très bien. J'essayais de suivre cet exemple de MSDN où ils utilisent ? à la ligne select new { person.FirstName, PetName = subpet?.Name ?? String.Empty }; il semble donc que je doive comprendre quand utiliser ??? et quand ne pas.

Erreur:

une expression tree lambda ne peut pas contenir un nul propagateur 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,
                  ....
                  ....
              };
    ....
    ....
 }
28
demandé sur Filburt 2017-06-21 19:16:42

2 réponses

l'exemple que vous citiez utilise LINQ pour des objets, où les expressions lambda implicites dans la requête sont converties en les délégués... alors que vous utilisez EF ou similaire, avec IQueryable<T> queryies, où les expressions lambda sont converties en arbres d'expression. Les arbres d'Expression ne supportent pas l'opérateur null conditionnel (ou tuples).

Juste le faire à l'ancienne:

price = co == null ? 0 : (co.price ?? 0)
51
répondu Jon Skeet 2017-06-21 16:19:47

le code que vous liez utilise List<T>. List<T> implémente IEnumerable<T> mais pas IQueryable<T>. Dans ce cas, la projection est exécutée en mémoire et ?. fonctionne.

Vous utilisez certains IQueryable<T>, qui fonctionne très différemment. IQueryable<T>, une représentation de la projection est créée, et votre fournisseur LINQ décide ce qu'il doit en faire à l'exécution. Pour des raisons de compatibilité ascendante,?. ne peut pas être utilisé ici.

selon votre fournisseur LINQ, vous pouvez être en mesure utiliser simplement de l' . et toujours pas obtenir tout NullReferenceException.

4
répondu 2017-06-21 16:24:13