为什么施工需要很多时间?

时间:2016-02-12 10:53:06

标签: c# entity-framework linq

我有与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)行非常缓慢。在这一行之后一切都很快。

有什么问题?

3 个答案:

答案 0 :(得分:2)

你的意思是它在实际执行数据库查询的行中很慢?提示 - 这就是为什么它很慢。

  

var payment = dbContext.Payments.First(t =&gt; t.Id = id);

我无法看到付款如何包含DocumentLiks - 这意味着它们是延迟加载的。这意味着这发生在foreach中。你去吧慢。

将它们包含在初始查询中。

答案 1 :(得分:0)

不是您问题的直接答案,而是建议您不要像这样嗤之以鼻。多态性允许您忽略对象的确切类型,使用它。

将您需要的任何行为放入BaseDocument并移除is Paymentis Bill

var payment = dbContext.Payments[id];
foreach(var link in payment.DocumentLiks)
{
    link.DoSomething();
}

答案 2 :(得分:0)

这可能是因为延迟加载。 在DBContext配置中指定:

 this.Configuration.LazyLoadingEnabled = false;