gpt4 book ai didi

linq-to-sql - LinqToSql .Contains 和 nvarchar vs varchar 参数 -> 索引转换计划

转载 作者:行者123 更新时间:2023-12-04 15:38:16 25 4
gpt4 key购买 nike

我只有一个映射在数据上下文中的表。这是感兴趣的列上的属性和属性:

[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

请注意,参数是 nvarchar!

当这个查询命中数据库时,它会生成一个可怕的计划,其中涉及 将 CustomerNumber 上的数百万行索引转换为 nvarchar 在它里面寻找之前。

我不允许更改表,但我可以更改查询和 dbml。我该怎么做才能在不进行此索引转换的情况下获取数据?

最佳答案

这是我现在解决这个问题的方法。这会将参数转换为所需的类型,然后运行查询。它生成与最初生成的 sql 相同的 sql,只是参数类型不同。

DbCommand myCommand = myDataContext.GetCommand(query);

foreach (DbParameter dbParameter in myCommand.Parameters)
{
if (dbParameter.DbType == System.Data.DbType.String)
{
dbParameter.DbType = System.Data.DbType.AnsiString;
}
}

myDataContext.Connection.Open();

System.Data.Common.DbDataReader reader = myCommand.ExecuteReader();
List<RecordType> result = myDataContext.Translate<RecordType>(reader).ToList();

myDataContext.Connection.Close();

关于linq-to-sql - LinqToSql .Contains 和 nvarchar vs varchar 参数 -> 索引转换计划,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/309991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com