我只有一个表映射到datacontext中。这里的属性和属性感兴趣的列:LinqToSql .Contains和nvarchar与varchar参数 - >索引转换计划
[Column(Storage="_CustomerNumber", DbType="VarChar(25)")]
public string CustomerNumber
{
此列,事实上,一个varchar(25),并有一个索引。
我有一些简单的代码:
DataClasses1DataContext myDC = new DataClasses1DataContext();
myDC.Log = Console.Out;
List<string> myList = new List<string>() { "111", "222", "333" };
myDC.Customers
.Where(c => myList.Contains(c.CustomerNumber))
.ToList();
生成此SQL文本:
SELECT [t0].[CustomerNumber], [t0].[CustomerName]
FROM [dbo].[Customers] AS [t0]
WHERE [t0].[CustomerNumber] IN (@p0, @p1, @p2)
-- @p0: Input NVarChar (Size = 3; Prec = 0; Scale = 0) [111]
-- @p1: Input NVarChar (Size = 3; Prec = 0; Scale = 0) [222]
-- @p2: Input NVarChar (Size = 3; Prec = 0; Scale = 0) [333]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8
注意,PARAMATERS是nvarchar的!
当此查询命中数据库时,它会生成一个可怕的计划,其中涉及将CustomerNumber上的数百万行索引转换为nvarchar,然后再搜索它。
我不允许更改表格,但我可以更改查询和dbml。我能做些什么来获取数据而无需获得此索引转换?
这工作,但有一个问题:在.Translate方法将无法正确加载相关实体T.(。换句话说,如果你在添加.LoadsWith 你的上下文,以及TOther与T有关,那么这将失败)。 –
dkr88
2012-12-04 22:34:19