0

Cette requête est compilée sans erreur:Impossible de convertir implicitement le type 'System.Collections.Generic.List <AnonymousType # 1>' à 'System.Linq.IQueryable <AnonymousType # 2>'

  var _entityList = context.customer 

       .Join(context.applications, 
       cust => cust.cust_id, 
       app => app.cust_id, 
       (cust, app) => new { customer = cust, application = app }) 

       .Join(context.advices, 
       cust => cust.application.app_id, 
       sa => sa.app_id, 
       (cust, sa) => new { customer = cust, advice = sa }) 

       .GroupBy(g => new { g.customer.customer.cust_id, g.customer.customer.cust_code, g.customer.customer.cust_name }) 
       .Select(g => new { cust_id = g.Key.cust_id, cust_code = g.Key.cust_code, cust_name = g.Key.cust_name }) 
       .ToList(); 

Bien que l'ajout d'une condition où la clause aux déclarations de requête ci-dessus le temps de compilation erreur de conversion de type:

  var _entityList = context.customer 

       .Join(context.applications, 
       cust => cust.cust_id, 
       app => app.cust_id, 
       (cust, app) => new { customer = cust, application = app }) 

       .Join(context.advices, 
       cust => cust.application.app_id, 
       sa => sa.app_id, 
       (cust, sa) => new { customer = cust, advice = sa }); 

      if (custcode != null && custcode != "") 
       _entityList = _entityList.Where(e => e.customer.customer.cust_code == custcode); 

      _entityList = _entityList 
       .GroupBy(g => new { g.customer.customer.cust_id, g.customer.customer.cust_code, g.customer.customer.cust_name }) 
       .Select(g => new { cust_id = g.Key.cust_id, cust_code = g.Key.cust_code, cust_name = g.Key.cust_name }) 
       .ToList(); // error on this line 

Impossible de convertir implicitement le type System.Collections.Generic.List<AnonymousType#1> à System.Linq.IQueryable<AnonymousType#2>

Qu'est-ce qui me manque?

+0

Êtes-vous sûr que e.customer.customer.cust_code et custcode sont des chaînes normales? – Marcus

+0

_entityListis de type IQueryable et que vous essayez d'affecter dans la liste? – Ehsan

+0

Je vous suggère de créer une classe de type et l'utilise dans vos sélections –

Répondre

1

Prenons l'exemple de code simplifié suivant:

var _entityList = Enumerable.Range(0, 1) 
    .Select(i=>new {i1 =i, i2 = i+1}); 
_entityList = _entityList 
    //.Select(i => new { i1 = i.i1, i2 = i.i2 }) // works 
    //.Select(i => i)        // works 
    .Select(i => new { i })       // fails 
    .ToList(); 

Dans votre premier scénario, il n'y a qu'un seul type anonyme impliqué, d'où _entityList est un List<AnonymousType#1>. Dans votre 2ème scénario, vous changez le type de retour d'un type anonyme:

new { 
    customer = cust, 
    advice = sa 
} 

à un autre:

new { 
    cust_id = g.Key.cust_id, 
    cust_code = g.Key.cust_code, 
    cust_name = g.Key.cust_name 
} 

donc une erreur de conversion se produit.

Essayez ceci:

var _entityList = context.customer 
    .Join(context.applications, 
      cust => cust.cust_id, 
      app => app.cust_id, 
      (cust, app) => new { customer = cust, application = app }) 
    .Join(context.advices, 
      cust => cust.application.app_id, 
      sa => sa.app_id, 
      (cust, sa) => new { customer = cust, advice = sa }) 
    .Where(e => (custcode != null && custcode != "") 
     ? e.customer.customer.cust_code == custcode : true) 
    .GroupBy(g => new { 
     g.customer.customer.cust_id, 
     g.customer.customer.cust_code, 
     g.customer.customer.cust_name }) 
    .Select(g => new { 
     cust_id = g.Key.cust_id, 
     cust_code = g.Key.cust_code, 
     cust_name = g.Key.cust_name }) 
    .ToList(); 
+0

Alors, comment contourner ce problème?Votre échantillon simplifié semble juste une illustration du problème. N'est-ce pas? –

+0

@ Ali.NET, voir ma réponse mise à jour. –

+1

Merci. Cela a fonctionné et aussi une meilleure approche. –

0

Lorsque vous appliquez la clause Lorsque vous utilisez le type

(cust, sa) => new { customer = cust, advice = sa }. 

Mais une fois que vous changez de

new { cust_id = g.Key.cust_id, cust_code = g.Key.cust_code, cust_name = g.Key.cust_name } 

Ils sont différents types de compilateur.

+0

Alors, comment pourrait-il être résolu? –

+0

Cela dépend de ce que vous voulez. Peut-être appliquer l'endroit juste avant ToList(). Quelque chose comme ceci '.Where (e => e.cust_code == custcode)' Je pense pourrait fonctionner. –

+0

Cela n'a pas fonctionné. En fait, il renvoie toujours une erreur après avoir supprimé le conditionnel où tout à fait. Cependant, je dois essayer d'autres suggestions maintenant. –

1

changement

_entityList = _entityList 
      .GroupBy(g => new { g.customer.customer.cust_id, g.customer.customer.cust_code, g.customer.customer.cust_name }) 
      .Select(g => new { cust_id = g.Key.cust_id, cust_code = g.Key.cust_code, cust_name = g.Key.cust_name }) 
      .ToList(); // error on this line 

à

var result = _entityList 
      .GroupBy(g => new { g.customer.customer.cust_id, g.customer.customer.cust_code, g.customer.customer.cust_name }) 
      .Select(g => new { cust_id = g.Key.cust_id, cust_code = g.Key.cust_code, cust_name = g.Key.cust_name }) 
      .ToList(); 
+1

oh je viens de l'avoir. ça a marché. Merci. –

Questions connexes