更好的性能Linq To SQl查询

时间:2018-07-11 07:40:32

标签: vb.net performance linq-to-sql

有没有一种方法可以提高LINQ to SQL查询的获取性能,而该查询的总数却超过10万?我应该使用跳过还是合并将总数据分为5个部分?提取时,我的查询花费了40多分钟。

   Dim query = From a In context.Orders
                        Join b In context.Status On a.OrderItem Equals b.OrderItem
                        Join c In context.Summary On a.OrderItem.Substring(0, 16) Equals c.OrderSuffix
                        Where Not (b.Status.Contains("E")) And a.Type = "AG" And a.OrderItem = b.OrderItem And a.OrderItem.Substring(0, 16) = c.OrderSuffix
                        Order By a.OrderItem.Substring(0, 16), a.Agn Ascending
                        Select a.OrderItem,
                        JobOr = a.auftrag_nr.Substring(0, 16),
                        Suffix = (a.auftrag_nr.Substring(0, 16).Substring(13)),
                        a.Agn,
                        a.Base,
                        b.Status,
                        a.Group,
                        a.Machine,
                        a.Article,
                        a.Height,
                        a.Sol, c.plan, a.DatePlanned

1 个答案:

答案 0 :(得分:-1)

实际上,您进行了很大的联接,然后进行过滤。

如果您有一个类似a.type =“ AG”的过滤器,那么在加入之前就应该应用它,这样甚至不会生成很多不必要的加入结果。

另一个适合您的想法: 编写linq查询的另一种方式。 喜欢:

dim foo as IQueryable(Of TypeInYourTable) = yourDBContext.yourTable.where(function(v) v.a = ...).SomeOtherLinqFunctions...

这样,您可以为每个表建立可查询对象并首先对其进行过滤(例如a.type =“ AG”),然后可以使用.Join(...)函数并进行适当的联接,您不只是比较两个数据集的一对值。

请注意,只要Queryable是Queryable,就不会对数据库进行任何调用。您需要致电例如.ToArray()或.ToList()或...强制执行调用。 如果不这样做,则返回一个Queryable,然后关闭它的上下文,然后尝试获取Queryable的结果,您将获得运行时异常。