我几天来一直在寻找解决方案。
我的应用程序中有八个实体,一个基础和七个从该基础实体继承的实体。一些子实体具有相同的属性。
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 == "...");
...
最后将它们连接起来。有比这种方法更聪明的方法吗?扩展方法等......
任何帮助都将不胜感激。
答案 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>();
一切似乎都适合我。