2009-10-29 16 views
5

Tôi đang cố gắng làm một cái gì đó tương tự như this post. phạm vi của loại thực thể sau khi nó được đúc thành một loại ẩn danh.Entity Framework - Chọn các cột cụ thể và trả về mạnh mẽ mà không bị mất cast

Cấu trúc của Khung pháp nhân của tôi có một thực thể cơ sở được gọi là Hành động. Từ đây, tôi đã tạo hai thực thể được kế thừa có tên là Sự kiệnHoạt động. Tôi muốn kéo trở lại X Hành động cuối cùng và chuyển chúng sang chế độ xem mạnh mẽ của tôi, chấp nhận Hành động và từ đó xác định xem Hoạt động hoặc Sự kiện của nó có hiển thị chế độ xem từng phần chính xác hay không.

if(Model.GetType() == typeof(Event)) 
{ 
    //render Event view 
} 
else if(Model.GetType() == typeof(Activity)) 
{ 
    //render Activity view 
} 

tôi có thể kéo cuối cùng 10 như một loại vô danh và sau đó đúc:

var result = from a in new DataContext().Actions 
      where a.UserId == someGuidValue 
      select new { a.CreatedOn, a.Summary }; 

List<Action> list = result.AsEnumerable() 
          .Select(o => new Action { 
              CreatedOn = o.CreatedOn, 
              Summary = o.Summary 
          }).ToList(); 

Tuy nhiên, khi tôi vượt qua Danh sách mới của hành động để xem mạnh mẽ gõ của tôi nó mất phạm vi cho dù đó là một Hoạt động hoặc Sự kiện vì nó được chọn là một Hành động. Câu hỏi của tôi là, không phơi bày cột phân biệt đối xử, có cách nào để đưa từng mục vào đúng loại hay tôi đang nói về điều này theo cách sai?

Trả lời

5

Một cắn kludgy, nhưng sẽ làm việc:

var result = from a in new DataContext().Actions 
      where a.UserId == someGuidValue 
      let IsEvent = a as Event != null 
      select new { a.CreatedOn, IsEvent, a.Summary }; 

List<Action> list = result.AsEnumerable() 
          .Select(o => o.IsEvent ? 
              (Action) new Event { 
               CreatedOn = o.CreatedOn, 
               Summary = o.Summary 
              } 
              : (Action) new Activity { 
               CreatedOn = o.CreatedOn, 
               Summary = o.Summary 
              } 
          }).ToList(); 

Ví dụ với các cột loại cụ thể, giả sử rằng e.EventSpecific là một loại nullable.

var result = from a in new DataContext().Actions 
      where a.UserId == someGuidValue 
      let ev = a as Event 
      let IsEvent = ev != null 
      select new { a.CreatedOn, IsEvent, a.Summary, ev.EventSpecific }; 

List<Action> list = result.AsEnumerable() 
          .Select(o => o.IsEvent ? 
              (Action) new Event { 
               CreatedOn = o.CreatedOn, 
               Summary = o.Summary, 
               EventSpecific = o.EventSpecific 
              } 
              : (Action) new Activity { 
               CreatedOn = o.CreatedOn, 
               Summary = o.Summary, 
               EventSpecific = o.EventSpecific // will be null, but using o.EventSpecific saves casting 
              } 
          }).ToList(); 

Nếu o.EventSpecific là của một loại nullable, sau đó bạn phải chuyển nó sang một loại nullable trong truy vấn L2E.

+0

Doh! Thật dễ dàng khi tôi nhìn vào nó. Tôi sẽ bắn nó khi tôi về nhà. – XVargas

+0

Tôi đã thử điều này nhưng nó nhanh chóng trở nên rõ ràng rằng tôi đã gặp phải vấn đề không thể kéo trở lại cột Hoạt động hoặc Sự kiện cụ thể khi thực hiện thao tác kéo ban đầu. Tôi đã buộc phải tạo ra một cái nhìn mà kéo trở lại các cột cần thiết và cũng kéo trở lại cột phân biệt đối xử. Sau khi tôi kéo nó trở lại, tôi chuyển sang kiểu gõ mạnh mẽ. Không phải là giải pháp lý tưởng nhưng nó hoạt động. – XVargas

+0

Bạn có thể kéo trở lại các cột kiểu phụ nếu bạn đưa chúng vào truy vấn L2E gốc. –

0

Có thể bạn đang đi sai hướng. Lúc đầu, tôi sẽ giả định rằng Action phải là một lớp trừu tượng và bạn sẽ không thể tạo ra các trường hợp của nó cả. Nếu sau đó bạn chỉ tìm nạp một tập hợp con các thuộc tính và tập hợp con không còn cho phép phân biệt giữa các sự kiện và hoạt động, có lẽ là cách sai để thử tạo sự kiện và hoạt động trong số chúng. Vì vậy, nó thực sự có vẻ không phải là một vấn đề kỹ thuật - nó phải được khá dễ dàng để bao gồm một số thông tin phân biệt đối xử trong các loại vô danh - nhưng một vấn đề thiết kế. Tôi đề nghị suy nghĩ lại nếu nó là cần thiết để phân biệt kết quả truy vấn và nếu như vậy nếu nó thực sự là một ý tưởng tốt để phân biệt kết quả trong trường hợp không có một phân biệt đối xử.

+0

Hãy để tôi giải thích những gì tôi đang cố gắng đạt được và sau đó bạn có thể hướng dẫn tôi thiết kế phù hợp. Đây là nguồn cấp dữ liệu của người dùng sẽ hiển thị các hoạt động và sự kiện theo thứ tự thời gian xen kẽ. Tôi đã tạo một bảng chứa cả hoạt động và sự kiện.Sau đó tôi sử dụng thừa kế để phân biệt giữa hai loại. Theo cách này, tôi có thể đơn giản kéo trở lại 10 giá trị cuối cùng và yêu cầu chúng được nhập mạnh mẽ. Trước đây tôi đã làm điều này với các thủ tục được lưu trữ, nơi các hoạt động và sự kiện đều nằm trong bảng của riêng họ. – XVargas

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