2012-06-27 29 views
7

phép nói rằng tôi có các đối tượng sauReturn loại thực thể khi sử dụng bảng mỗi loại thừa kế

public abstract class Animal 
{ 
    public int Id {get;set;} 
} 

public class Cat : Animal 
{ 
} 

public class Dog : Animal 
{ 
} 

Có thể xác định loại thực thể mà không cần tạo một thể hiện.

var id = 1; 
var type = context.Animals.GetTypeOfAnimal(id) 

public static Type GetTypeOfAnimal(this ObjectSet<Animal> source, int id) 
{ 
    // What shall I do here, I dont want to fetch the instance at this point... 
    var animal = source.First(a => a.Id == id); 
    return animal.GetType(); 
} 

Một giải pháp tôi nghĩ về việc sử dụng các phương pháp sau đây ...

public static Type GetTypeOfAnimal(this ObjectSet<Animal> source, int id) 
{ 
    var info = source.Where(a => a.Id == id).Select(a => new {IsDog = a is Dog, IsCat = a is Cat}).First(); 

    if(info.IsDog) return typeof(Dog); 
    if(info.IdCat) return typeof(Cat); 

    return null; 
} 
+1

Tôi không nghĩ bạn có thể. – Yeonho

+0

Thiết kế có mùi một chút; truy vấn loại phụ cụ thể của loại chung và sau đó phân nhánh có thể được thay thế bằng đa hình. – millimoose

+0

Tại thời điểm nhận xét của bạn, nguồn đã được tìm nạp. Đó là những gì bạn đang cố gắng để ngăn chặn? EDIT: Không có bây giờ tôi nhìn thấy. Bây giờ suy nghĩ. – Michael

Trả lời

2

Không có cách nào để có được thông tin này mà không cần truy vấn đến cơ sở dữ liệu. Bạn đang sử dụng TPT - nó có nghĩa là cơ sở dữ liệu chứa các bảng Animal, Dog và Cat. Thừa kế trong cơ sở dữ liệu được mô hình hóa thông qua quan hệ một-một giữa Animal và Dog và giữa Animal và Cat. Tối thiểu những gì bạn phải làm là truy vấn cả hai bảng Animal và Dog cho Id đó (nó chỉ có thể tồn tại trong một trong số chúng). Vấn đề đầu tiên là bạn không thể truy vấn trực tiếp các bảng này với EF vì EF chỉ có thể làm việc với toàn bộ thực thể (không chỉ với các phần được ánh xạ tới một bảng) - bạn phải sử dụng SQL trực tiếp. Vấn đề thứ hai là sự mong manh của giải pháp này. Nếu bạn thêm thực thể có nguồn gốc mới, bạn phải sửa lỗi truy vấn này (tương tự xảy ra với ví dụ của bạn).

Lý do tại sao các truy vấn TPT chậm là EF phải truy vấn tất cả cây thừa kế = trong trường hợp của bạn Animal tham gia với Dog nối với Animal tham gia với Cat. Có một số cải tiến hiệu suất trong .NET 4.5 để truy vấn cây thừa kế TPT nhưng nó sẽ không ảnh hưởng đến truy vấn của bạn vì nó chỉ đơn giản là truy vấn toàn bộ cấu trúc.

+0

Chỉ vì tò mò: bạn có thể tránh hình phạt này bằng cách sử dụng phép chiếu chỉ sử dụng các thuộc tính được xác định trong 'Động vật'? – millimoose

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