2011-11-14 36 views
15

Tôi có truy vấn sau đây Entity Framework:LINQ to Objects Tham gia hai bộ sưu tập để thiết lập giá trị trong bộ sưu tập đầu tiên

var results = from r in db.Results 
       select r; 

Tôi đang sử dụng AutoMapper để ánh xạ kiểu khác:

var mapped = Mapper.Map<IEnumerable<Database.Result>, IEnumerable<Objects.Result>>(results); 

Trong Loại Objects.Result của tôi, tôi có một thuộc tính được gọi là lý do không đến từ cơ sở dữ liệu. Nó đến từ một nguồn mà tôi cần phải về cơ bản cư trở thành loại ánh xạ của tôi:

var reasons = new List<Reason> 
{ 
    new Reason { Id = 1, Reason = "asdf..." } 
}; 

tôi cần phải tham gia vào những lý do có thu ánh xạ của tôi và thiết lập thuộc tính Lý do trong bộ sưu tập ánh xạ của tôi bằng cách sử dụng giá trị từ lý do của tôi bộ sưu tập. Điều này có thể không?

// need something like this: 
mapped = from m in mapped 
      join r in reasons on m.Id equals r.Id 
      update m.Reason = r.Reason 
      select m; 

Rõ ràng là mã trên không biên dịch, nhưng tôi có thể viết mã nào mà tôi muốn không?

Trả lời

21

Thực hiện đột biến trong vòng lặp. Tối ưu, LINQ nên không có đột biến đối với (các) bộ sưu tập mà nó hoạt động chống lại. Sử dụng LINQ để lọc, đặt hàng, dự án dữ liệu của bạn, sử dụng các kỹ thuật truyền thống để sửa đổi.

var joinedData = from m in mapped 
       join r in reasons on m.Id equals r.Id 
       select new { m, r }; 

foreach (var item in joinedData) 
{ 
    item.m.Reason = item.r.Reason; 
} 
+0

Cảm ơn. Tôi đoán hiệu suất-khôn ngoan nó không phải là một hit lớn kể từ khi tôi phân trang dữ liệu trước khi tôi bản đồ, do đó, lặp qua một lần thứ hai sẽ không phải là một vấn đề. – Dismissile

+0

Nếu bạn đo lường và thấy rằng đây là một nút cổ chai hiệu suất, hãy quay lại và giải quyết nó, chúng tôi * có thể * tạo đột biến nếu chúng tôi * có *. Tuy nhiên, tôi sẽ không làm điều đó cho đến khi tôi biết rằng đây là những gì đang làm chậm tôi xuống. –

+0

Tôi trang khoảng 10 mục mỗi lần. Tôi rất nghi ngờ nó sẽ gây ra bất kỳ vấn đề hiệu suất :) – Dismissile

0

Một phương pháp brute force sẽ là: -

foreach(var m in mapped) 
{ 
    m.Reason = reasons.Single(r=> r.Id == m.Id).Reason; 
} 

Trong thực tế, đây là thực hiện là khá gần với pseudo-code của bạn.

5

Điều này có thể tiết kiệm rất nhiều thời gian của bạn. Mã dưới đây dành cho Tham gia hai bộ sưu tập và đặt giá trị thuộc tính của bộ sưu tập đầu tiên.

class SourceType 
{ 
    public int Id; 
    public string Name; 
    public int Age { get; set; } 
    // other properties 
} 

class DestinationType 
{ 
    public int Id; 
    public string Name; 
    public int Age { get; set; } 
    // other properties 
} 
    List<SourceType> sourceList = new List<SourceType>(); 
    sourceList.Add(new SourceType { Id = 1, Name = "1111", Age = 35}); 
    sourceList.Add(new SourceType { Id = 2, Name = "2222", Age = 26}); 
    sourceList.Add(new SourceType { Id = 3, Name = "3333", Age = 43}); 
    sourceList.Add(new SourceType { Id = 5, Name = "5555", Age = 37}); 

    List<DestinationType> destinationList = new List<DestinationType>(); 
    destinationList.Add(new DestinationType { Id = 1, Name = null }); 
    destinationList.Add(new DestinationType { Id = 2, Name = null }); 
    destinationList.Add(new DestinationType { Id = 3, Name = null }); 
    destinationList.Add(new DestinationType { Id = 4, Name = null }); 


    var mapped= destinationList.Join(sourceList, d => d.Id, s => s.Id, (d, s) => 
    { 
     d.Name = s.Name; 
     d.Age = s.Age; 
     return d; 
    }).ToList(); 
+1

Bạn nên giải thích nó đang làm gì. –

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