从子实体的属性中过滤基本实体

时间:2012-02-01 19:29:53

标签: c# entity-framework-4

我几天来一直在寻找解决方案。

我的应用程序中有八个实体,一个基础和七个从该基础实体继承的实体。一些子实体具有相同的属性。

public class LogEntry(){
    public int LogEntryId{get;set;}
    public string ...
}

public class TestEntry : LogEntry{
   ....
   public string SomeProperty{get;set;} //SomePropertyThatIsNotInBaseClass
   ....
}
public class XEntry : LogEntry{
   ....
   public string SomeProperty{get; set;}
   ....
}

我试图通过这个SomeProperty过滤基础实体。我正在尝试像

这样的查询
var value = Db.LogEntry.Where(i=>i.SomePropery == "some string");

不允许。

我只能得到我想要的东西
IQueryable<LogEntry> first = Db.LogEntry.OfType<TestEntry>.Where(i=>i.SomeProperty == "...");
IQueryable<LogEntry> second = Db.LogEntry.OfType<XEntry>.Where(i=>i.SomeProperty == "...");
...

最后将它们连接起来。有比这种方法更聪明的方法吗?扩展方法等......

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

修改

更仔细地看一下你的例子,我不认为你想做的事情是可能的。如果要针对BASE实体类型编写查询,则只能查询基本类型中定义的字段。

由于LogEntry中未定义“SomeProperty”,因此无法编写此查询:

var logEntries = db.LogEntry.Where(r => r.SomeProperty == "foo");

因为在LogEntry类中没有定义SomeProperty。

如果要针对基类编写查询,则需要执行以下操作:

public class TPTContext : DbContext
{
    public TPTContext() : base("name=TPT")
    { }

    public DbSet<BillingDetail> BillingDetails { get; set; }
}

public abstract class BillingDetail
{
    public int BillingDetailId { get; set; }
    public string Owner { get; set; }
    public string Number { get; set; }
}

[Table("BankAccounts")]
public class BankAccount : BillingDetail
{
    public string BankName { get; set; }
    public string Swift { get; set; }
}

[Table("CreditCards")]
public class CreditCard : BillingDetail
{
    public int CardType { get; set; }
    public string ExpiryMonth { get; set; }
    public string ExpiryYear { get; set; }
}

我针对基类编写了以下查询:

TPTContext db = new TPTContext();

var allAccounts = db.BillingDetails.Where(b => b.Owner == "boran");
var bankAccounts = allAccounts.OfType<BankAccount>();
var creditCards = allAccounts.OfType<CreditCard>();

一切似乎都适合我。