2013-08-05 2 views
7

abgeleitet werden, ich habe folgende wo objectiveData ist: IEnumerable<Objective>LINQ - Typ Argumente können nicht von der Verwendung in einer ausgewählten

public IList<Objective> createObjectives() 
    { 
     var objectiveData = GetContent.GetType5(); 
     var objectives = objectiveData.Select(o => { 
      var result = new Objective { 
          Name = o.Name, 
          Text = o.Text 
      }; 
      if (o.Name != null && o.Name.EndsWith("01")) 
      { 
       result.ObjectiveDetails.Add 
       (
        new ObjectiveDetail 
        { 
         Text = o.Text 
        } 
       ); 
      } 
     }); 
     return objectives.ToList(); 
    } 

Ich erhalte eine Fehlermeldung auf der Linie mit dem „Select“ zu sagen:

The type arguments for method 'System.Linq.Enumerable.Select<TSource,TResult> 
(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,int,TResult>)' 
cannot be inferred from the usage. Try specifying the type arguments explicitly. 

Hier ist mein Ziel Klasse:

public partial class Objective : AuditableTable 
{ 
    public Objective() 
    { 
     this.ObjectiveDetails = new List<ObjectiveDetail>(); 
    } 
    public int ObjectiveId { get; set; } 
    public string Name { get; set; } 
    public string Text { get; set; } 
    public virtual ICollection<ObjectiveDetail> ObjectiveDetails { get; set; } 
} 
+0

Was gibt 'GetContent.GetType5()' zurück? –

+0

@ LasseV.Karlsen lesen die Frage von oben ... –

+0

OK, das Problem ist, dass Ihre wählen Sie nichts zurückliefert. –

Antwort

1
var objectives = objectiveData.Select(o => { 
     var result = new Objective { 
         Name = o.Name, 
         Text = o.Text 
     }; 
     if (o.Name != null && o.Name.EndsWith("01")) 
     { 
      result.ObjectiveDetails.Add 
      (
       new ObjectiveDetail 
       { 
        Text = o.Text 
       } 
      ); 
     } 
     //you miss this 
     return result; 
    }); 
11

Sie benötigen

return result; 

am Ende des Ausdrucks.

0

Zunächst einmal LINQ und Nebenwirkungen sind ... gut, schlecht. Aufgrund von Lazy Loading und vielen anderen Problemen. Allerdings müssen, was Sie ist eine return result; Zeile hinzufügen an dann Ihres Codes enden wie so:

var objectives = objectiveData.Select(o => { 
     var result = new Objective { 
         Name = o.Name, 
         Text = o.Text 
     }; 
     if (o.Name != null && o.Name.EndsWith("01")) 
     { 
      result.ObjectiveDetails.Add 
      (
       new ObjectiveDetail 
       { 
        Text = o.Text 
       } 
      ); 
     } 
     return result; 
    }); 

jedoch für diese in einer regelmäßigeren Art und Weise zu verhalten, würde ich es tun, wie folgt:

var objectives = 
    objectiveData.Select(o => new Objective { Name = o.Name, Text = o.Text}) 
result.ObjectiveDetails.AddRange(
    objectiveData.Where(o => (o.Name ?? "").EndsWith("01")) 
       .Select(o => new ObjectiveDetail { Text = o.Text })); 
+0

Das ist ziemlich anders als der ursprüngliche Code ... wo ist das Ergebnis in Ihrer vorgeschlagenen Lösung deklariert? – Plymouth223

+0

@ Plymouth223 Der erste hat sein Original, aber der zweite ist, wie es ** sollte ** getan werden. –

+0

Die zweite erklärt nicht 'Ergebnis', sondern benutzt sie. d.h. der zweite Block würde nicht kompilieren und sein Verhalten ist ziemlich verschieden von dem ursprünglich geposteten Code. – Plymouth223

Verwandte Themen