2013-08-05 19 views
7

Tôi đã sau nơi objectiveData là: IEnumerable<Objective>LINQ - đối số loại không thể được suy ra từ việc sử dụng trong một lựa chọn

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(); 
    } 

Tôi nhận được một lỗi trên phù hợp với "chọn" nói:

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. 

đây là lớp Mục tiêu của tôi:

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

Trả về 'GetContent.GetType5()' là gì? –

+0

@ LasseV.Karlsen Đọc câu hỏi từ trên cùng ... –

+0

OK, vấn đề là lựa chọn của bạn không trả lại bất cứ điều gì. –

Trả lời

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

Bạn cần

return result; 

ở cuối biểu thức của bạn.

0

Trước hết, LINQ và tác dụng phụ là ... tốt, xấu. Do tải chậm và nhiều vấn đề khác. Tuy nhiên, những gì bạn cần là thêm một dòng return result; tại sau đó kết thúc của mã của bạn như sau:

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; 
    }); 

Tuy nhiên, đối này để hành xử một cách thường xuyên hơn, tôi sẽ làm điều đó như thế này:

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

Điều này hoàn toàn khác với mã ban đầu ... kết quả được khai báo trong giải pháp được đề xuất của bạn ở đâu? – Plymouth223

+0

@ Plymouth223 Cái đầu tiên có bản gốc, nhưng cái thứ hai là cách nó ** nên ** được thực hiện. –

+0

Cái thứ hai không khai báo 'kết quả' nhưng sử dụng nó. tức là khối thứ hai sẽ không biên dịch và hành vi của nó hoàn toàn khác với mã được đăng ban đầu. – Plymouth223

Các vấn đề liên quan