7

Vì vậy, tôi có một thực thể có thuộc tính điều hướng có loại có phân cấp lớp. (Tên tổ chức thay đổi để bảo vệ tội)Entity Framework - truy vấn chỉ định loại được thừa kế cho thuộc tính điều hướng

class ParentEntity 
{ 
    virtual ChildEntity TheProperty { get; set; } 
    virtual string AnotherProperty { get; set; } 
    virtual string AnotherProperty2 { get; set; } 
} 

class ChildEntity 
{ 
} 

class ChildSubEntity : ChildEntity 
{ 
    virtual string InterestingProperty { get; set; } 
} 

Làm thế nào tôi có thể truy vấn cho các tổ chức ParentClass, với một trong những điều kiện truy vấn của tôi là nơi TheProperty là loại ChildSubClass và InterestingProperty có một giá trị cụ thể không?

Tôi đã thử

ObjectContext context = GetContext(); 
var result = context.ParentEntities. 
    Where(e => e.AnotherProperty == AnotherInterestingValue). 
    Where(e => e.TheProperty is ChildSubEntity). 
    Where(e => ((ChildSubEntity)e.TheProperty). 
    InterestingProperty == InterestingValue). 
    ToList(); 

Và nhận được lỗi "Unable to cast kiểu 'ChildEntity' gõ 'ChildSubEntity'. LINQ to Entities chỉ hỗ trợ đúc mẫu Entity Data loại nguyên thủy.".

Tôi phải giải quyết để làm phẳng danh sách và áp dụng điều kiện này sau khi dữ liệu đã được truy xuất từ ​​cửa hàng thực thể. Có thể viết điều kiện này dưới dạng LINQ to Entities sẽ chấp nhận không? Để rõ ràng, đây là đơn giản hóa, tôi thực sự áp dụng một số điều kiện theo lập trình, xây dựng biểu thức truy vấn bằng cách sử dụng LinqKit, với một số điều kiện là thuộc tính của ParentEntity, một số trên ParentEntity và một số khác các thực thể con của ParentEntity.

Trả lời

14

Bạn phải sử dụng OfType giải quyết chính xác bằng cách LINQ to Entities. Sử dụng nó chống lại ChildEntity bộ sưu tập và chọn ParentEntities liên quan đến các đối tượng được chọn ChildEntity.

ObjectContext context = GetContext(); 
var result = context.ChildEntities.OfType<ChildSubEntity> 
.Where(e => e.InterestingProperty == InterestingValue) 
.SelectMany(e = > e.ParentEntity) 
.ToList(); 
+0

Câu trả lời hay. Tuy nhiên tôi có nhiều tiêu chí khác về ParentEntity cần được đáp ứng, tôi sẽ chỉnh sửa câu hỏi để làm rõ điều đó. – SamStephens

+0

Chỉ cần thêm 'Where' trong' SelectMany' để lọc 'ParentEntity' –

+0

Ồ, giờ đây * là * thú vị. Tôi sẽ chơi và quay lại với bạn. – SamStephens

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