让我们说我有一个术语数据库和一个字符串列表,这是一个好的(有效的)想法吗?它工作顺利,但我不确定它是可扩展的还是最有效的。
var results =
from t in Terms
join x in Targets on t.Term equals x
select t;
此处Terms是一个带有索引表Term的数据库表。目标是一个IEnumerable字符串。条款可能包含数百万,目标可能在10-20个字符串之间。有什么想法吗?
答案 0 :(得分:1)
最重要的是,就效率而言,重要的是对数据库执行的查询是否有效。要看到这一点,您可以使用SQL事件探查器或查找将向您显示由linq-to-sql生成的SQL的应用程序。
如果您使用SQL事件探查器,请务必让它查找存储过程,因为Linq-to-sql使用exec_sql过程来执行查询。
答案 1 :(得分:0)
如果你需要在一个键上加入两个表,就像在你的例子中一样,除了实际的连接之外没有别的方法来表达它。你拥有的就是它能够获得的效率。
但是,更改select
只返回您感兴趣的字段,并确保修剪它们,因为sql数据库喜欢返回带有尾随空格的char
字段,并且需要时间通过网络处理和传输。
答案 2 :(得分: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异常。