我有与EntityFramework一起使用的类:
public partial class BaseDocument
{
public BaseDocument()
{
DocumentLinks = new List<DocumentLink>();
}
public int Id {set;get;}
public virtual List<DocumentLink> DocumentLinks {set;get;}
}
public partial class Payment:BaseDocument
{
}
public partial class Bill:BaseDocument
{
}
public partial class DocumentLink
{
public int Id{set;get;}
public int StartDocId{set;get;}
public int EndDocId{set;get;}
public virtual BaseDocument StartDoc{set;get;}
public virtual BaseDocument EndDoc{set;get;}
}
现在我选择Linq文档并想要遍历他的DocumentLinks
列表。
var payment = dbContext.Payments.First(t=>t.Id = id);
foreach(var link in payment.DocumentLinks)
{
if (link is Payment)
{
//do something
}
else if (link is Bill)
{
//do something
}
}
我的代码在if (link is Payment)
行非常缓慢。在这一行之后一切都很快。
有什么问题?
答案 0 :(得分:2)
你的意思是它在实际执行数据库查询的行中很慢?提示 - 这就是为什么它很慢。
var payment = dbContext.Payments.First(t =&gt; t.Id = id);
我无法看到付款如何包含DocumentLiks - 这意味着它们是延迟加载的。这意味着这发生在foreach中。你去吧慢。
将它们包含在初始查询中。
答案 1 :(得分:0)
不是您问题的直接答案,而是建议您不要像这样嗤之以鼻。多态性允许您忽略对象的确切类型,使用它。
将您需要的任何行为放入BaseDocument
并移除is Payment
和is Bill
:
var payment = dbContext.Payments[id];
foreach(var link in payment.DocumentLiks)
{
link.DoSomething();
}
答案 2 :(得分:0)
这可能是因为延迟加载。 在DBContext配置中指定:
this.Configuration.LazyLoadingEnabled = false;