7

için kalıtsal tipini belirten sorgu Yani bir sınıf hiyerarşisi ile bir türüne sahip bir navigasyon özelliğine sahip bir varlık var. Theproperty tipi ChildSubClass ait olup InterestingProperty özel bir değere sahip nerede olmak benim sorgu koşulları biriyle,Varlık Framework - gezinti özelliği

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

nasıl ParentClass varlıklar için sorgulayabilir (varlık isimleri suçlu korumak için değiştirilmiştir)?

Ben

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

çalıştı Ve olsun hata ettik " 'ChildSubEntity' yazın türü 'ChildEntity' yayın yapılamıyor. Sadece varlık veri modeli ilkel türleri döküm destekler varlıkları için LINQ.".

O listeyi düzleşme ve veri varlık deposundan alındıktan sonra bu durumun uygulanması razı olmak yaşıyorum. Bu koşulu, Varlıkların kabul edeceği bir LINQ formunda yazmak mümkün mü?

Net olmak gerekirse, bu bir basitleştirmedir, aslında bir dizi koşulu programlı olarak uygulayarak, LinqKit kullanarak bir sorgu ifadesi yapıyorum; bazı koşullar, ParentEntity'nin özelliklerinde, bazılarında ParentEntity ve bazılarında ParentEntity'nin çocuk varlıkları.

cevap

14

Sen OfType doğru LINQ to Entities tarafından çözüldü onun kullanmak zorunda. ChildEntity koleksiyonuna karşı kullanın ve seçilen ChildEntity nesneleriyle ilgili ParentEntities öğesini seçin.

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

İyi cevap. Bununla birlikte, karşılanması gereken ParentEntity hakkında birçok başka kritere sahibim, bunu açıklığa kavuşturmak için soruyu düzenleyeceğim. – SamStephens

+0

Sadece filtrelemek için 'SelectMany' içinde Where'' eklemek 'ParentEntity' –

+0

Oh, şimdi o * ilginç * olduğunu. Bir oyun oynayacağım ve sana döneceğim. – SamStephens