如何判断LINQ to SQL查询是否已转换为SQL语句?

时间:2010-10-15 20:04:18

标签: vb.net visual-studio linq-to-sql visual-studio-2010

我们广泛使用LINQ to SQL,并且我们遇到的最大性能缺陷之一是查询无法转换为SQL的情况,因此整个数据库表被加载到内存中并且查询由。净。例如,此查询

Dim Foo = (From c in Db.Contacts Select c Where c.ContactID=MyContactID)

转换为简单的SQL查询,而

Dim Foo = (From c in Db.Contacts Select c Where c.ContactID=SafeInt(MyContactID))

不是因为SafeInt是我们自己的函数,并且没有SQL等价物;所以整个联系人表被加载到内存中并由LINQ搜索到对象,这要慢得多。

凭借一点经验,我们在避免这种情况方面做得更好。但它并不总是显而易见的,这是一种在你处理大量数据并且事情开始放缓之前通常不会发现的问题。

是否有直接的方式来查看 - 无论是在Visual Studio中还是其他方式 - 如何处理LINQ查询,而不是试错?

3 个答案:

答案 0 :(得分:1)

你试过LinqPad吗?这是一款出色的Linq原型制作工具。在将它们粘贴到我的代码之前,我经常使用它来构建我的Linq查询的原型。该工具是免费的。

您是否也知道可以将IQueryable(发送到SQL Server)转换为IEnumerable,以便.NET Framework而不是SQL Server处理查询?如果我需要在Linq查询中调用我自己的方法之一,我有时会这样做。我将查询分为两部分。第一部分我将查询为IEnumerable,另一部分为IQueryable,然后将两者连接在一起。

答案 1 :(得分:0)

L2SProf (LINQ to SQL Profiler)是另一种可以帮助您追踪低效查询的选项。它有一系列警报,例如Excessive Number of Rows ReturnedUnbounded Result Set,等等。我发现它有助于解决您所看到的问题。

答案 2 :(得分:0)

你有没有试过这样的事情:

Sub Main
    Dim c = From a In Context.Addresses 
            Where a.City = "London" 
            Select a

    Console.Write(Context.GetCommand(c).CommandText)
End Sub

这应该揭示将被使用的SQL查询。