我有与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)
处工作非常缓慢。在这条线之后,一切都很快。
怎么了?
您的意思是实际执行数据库查询的行很慢?提示 - 这就是它很慢的原因。
var payment = dbContext.Payments.First(t=>t.Id = id);
我看不出付款如何包含 DocumentLiks - 这意味着它们是延迟加载的。这意味着这发生在福尔奇。你去吧。慢。
将它们包含在初始查询中。
不是对你的问题的直接回答,而是建议你不应该像这样打字嗅探。多态性允许您忽略对象的确切类型,使用它。
将您需要的任何行为放入BaseDocument
并删除is Payment
和is Bill
:
var payment = dbContext.Payments[id];
foreach(var link in payment.DocumentLiks)
{
link.DoSomething();
}
这可能是因为延迟加载。在 DBContext 配置中指定:
this.Configuration.LazyLoadingEnabled = false;