Linq效率 - 如何最好地在数据库中查询值列表?

时间:2010-12-15 19:48:51

标签: c# linq linq-to-sql

让我们说我有一个术语数据库和一个字符串列表,这是一个好的(有效的)想法吗?它工作顺利,但我不确定它是可扩展的还是最有效的。

var results =
            from t in Terms
            join x in Targets on t.Term equals x
            select t;

此处Terms是一个带有索引表Term的数据库表。目标是一个IEnumerable字符串。条款可能包含数百万,目标可能在10-20个字符串之间。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

最重要的是,就效率而言,重要的是对数据库执行的查询是否有效。要看到这一点,您可以使用SQL事件探查器或查找将向您显示由linq-to-sql生成的SQL的应用程序。

如果您使用SQL事件探查器,请务必让它查找存储过程,因为Linq-to-sql使用exec_sql过程来执行查询。

答案 1 :(得分:0)

如果你需要在一个键上加入两个表,就像在你的例子中一样,除了实际的连接之外没有别的方法来表达它。你拥有的就是它能够获得的效率。

但是,更改select只返回您感兴趣的字段,并确保修剪它们,因为sql数据库喜欢返回带有尾随空格的char字段,并且需要时间通过网络处理和传输。

答案 2 :(得分:0)

嗯,我不知道你可以像这样加入当地的收藏品。也许这是一个.Net 4.0功能?

我经常发出这样的问题:

IQueryable<Term> query =
  from t in Terms 
  where Targets.Contains(t.Term)
  select t; 

有一些警告。

  • 变量x必须是List<string>引用。变量x可能不是IList<string>参考。

  • 列表中的每个字符串都会转换为sql参数。虽然linq to sql很乐意将数千个字符串翻译成参数(我看过50k参数),但Sql Server只接受~2100。如果超过此限制,您将获得sql异常。

  • nvarchar vs varchar indexes