我正在开发一个应用程序,它可以使用实体框架和Devart连接到多个类似的数据库。我已经通过创建我的EF模型实现的一些接口并且它工作正常来完成此操作,但是我遇到了性能问题,
采取以下接口
public interface IEventBookEntry {
int EntryId { get;set;}
int EventBookId {get;set;}
bool Flagged {get;set;
IEntry Entry {get;set;}
}
和
public Interface IEntry {
int EntryId {get;set;}
DateTime EntryTimestamp {get;set;}
ICollection<IEventBookEntry> EventBookEntries {get;set;}
}
我的两个实体模型(连接到不同的数据库)实现了上述接口。
这意味着我可以在我的BLL层中编写查询,这些查询可以针对任一实体模型运行,非常棒!
让我们采用以下Linq方法查询:
var eventBookEntries = new EventBookRepository().GetList(eb => eb.EventBookId == 123 && eb.Entry.EntryTimestamp > DateTime.Now.AddDays(-3));
以上代码获取eventBookId == 123的所有eventbook条目,并且条目的时间戳在过去3天内。
为了完整性,这里是&#34; GetList&#34;的详细信息。 eventBookRepository中的方法
public IList<IEventBookEntry> GetList(Func<IEventBookEntry, bool> where, params Expression<Func<IEventBookEntry, object>>[] navigationProperties)
{
return new EventBookEntities().EventBookEntries.Where(where).ToList();
}
你会期望在幕后生成的sql就是这样的
SELECT Extent1.EntryId, Extent1.EventBookId, Extent1.Flagged
FROM EventBookEntries Extent1
INNER JOIN Entries Extent2 ON Extent1.EntryId = Extent2.EntryId
WHERE Extent1.EventBookId = 123
AND Extent2.EntryTimestamp > 22/01/2016
不幸的是,发生的事情是我们没有获得带有条目连接的单个查询,而是我们得到一个查询,它检索所有EventBookEntries,其中EventBookId = 123,然后返回每行查询获得每个条目。
SELECT Extent1.EntryId, Extent1.EventBookId, Extent1.Flagged
FROM EventBookEntries Extent1
WHERE Extent1.EventBookId = 123
SELECT Extent1.EntryId, Extent1.EntryTimestamp
FROM Entries Extent1
WHERE Extent1.EntryId = :EntityKeyValue1
因此,在使用基于接口类型的导航属性生成查询时,似乎存在问题,
更新
我现在已更改为Code First Entity Framework,其中一个模型可删除所有烟雾和镜像。不幸的是,我得到了完全相同的行为。
这是我的模特
[Table("ENTRIES")]
public class Entry
{
public Entry()
{
EventbookEntries = new List<EventbookEntry>();
}
[Key, Column("ENTRY_ID", Order = 1)]
public long EntryId { get; set; }
[Column("ENTRY_TIMESTAMP")]
public DateTime EntryTimestamp { get; set; }
[ForeignKey("EntryId")]
public virtual ICollection<EventbookEntry> EventbookEntries {get;set;}
}
和
[Table("EVENT_BOOK_ENTRIES")]
public class EventbookEntry
{
[Key, Column("ENTRY_ID", Order = 1)]
public long EntryId { get; set; }
[Key, Column("EVENT_BOOK_ID", Order = 2)]
public long EventbookId { get; set; }
[ForeignKey("EntryId")]
public virtual Entry Entry { get; set; }
}
我还创建了一个Db
所以现在我只是直接使用dbContext并更改我的数据库提供程序,这可以解决问题,但我仍然会得到相同的行为!
我的DbContext有2个DbSets
/// <summary>
/// Gets or sets the entries.
/// </summary>
/// <value>The entries.</value>
public DbSet<Entry> Entries { get; set; }
/// <summary>
/// Gets or sets the eventbook entries.
/// </summary>
/// <value>The eventbook entries.</value>
public DbSet<EventbookEntry> EventbookEntries { get; set; }
这是我的linq方法查询
var start = DateTime.Now.AddDays(-20);
var eventBookId = 124;
var eventbookEntries = new EventBookContext().EventbookEntries.Where(eb=> eb.EventbookId == eventBookId && eb.Entry.EntryTimestamp > start).ToList();
我的问题是如何在导航属性上实现接口,以确保实体框架将在查询中使用内部联接而不是上面显示的行为?
由于
任性
答案 0 :(得分:0)
您可以使用Fluent API(http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx)
来使用关系 在你的DbContext中:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="tahun1" name="tahun1" type="number">
<input id="tahun2" name="tahun2" type="number" readonly>