在不破坏索引的情况下修剪linq2sql查询中的字段

时间:2013-02-14 06:22:12

标签: c# sql linq-to-sql

我正在加入来自2个不同表格的邮政编码,这些表格包含大量数据并在邮政编码上编入索引。

如果我删除了t.zipplus4上的数字,则联接有效邮政编码字段只有5位数。
不幸的是使用子字符串或替换会破坏索引,因此查询耗时太长。
我显然不能使用trimstart? bc它不存在于sql中。
在sql left([Zip Code],5)与索引一起工作正常。有没有办法在linq我能把它拉下来?

示例:

  var query = (from t in db.test
             join g in db.test2 on t.zipplus4 equals g.zip
             select t).ToList();

2 个答案:

答案 0 :(得分:1)

c#中LEFT的最接近的等价物是String.Substring方法,它转换为tsql的SUBSTRING函数,这不是您的选择。

如果您只想修剪不必要的空格,请使用String.Trim方法将其转换为类似LTRIM(RTRIM([t0].[zipplus4]))的内容。

您可以尝试使用SqlMethods.Like来使用tsql的LIKE(这里的问题不清楚LIKE是否合适):<​​/ p>

var query = (from t in db.test
             from g in db.test2
             where SqlMethods.Like(t.zipplus4, g.zip + '%')
             select t).ToList();

但我不确定这是否打破了索引。

如果所有这些都不适合您,请考虑为此创建a stored procedure

答案 1 :(得分:0)

在不破坏索引的情况下,无法在linq中进行修剪。答案是为ado.net抛弃linq2sql,以便获得所有sql功能。