LINQ, MSSQL и типы параметров команд
От: fddima  
Дата: 12.10.10 21:23
Оценка:
Привет!

Столкнулся с такой проблемой — запросы крайне медленно исполняются (раз в 10-20 медленнее, в зависимости от данных). После медитации с QA, понял что проблема в том, что у меня вся база в VARCHAR (и менять это не вариант) и если параметры в запрос подавать как VARCHAR то всё хорошо, если подавать как NVARCHAR — сиквел генерирует иные планы запросов и не очень эффективные. Проявляется особенно сильно это у меня с CONTAINS (полнотекстовый поиск), хотя здесь рассказано что и на более простых случаях можно отгрести.
Отсюда вопрос — можно ли как-то управлять этим всем?

Функцию для contains сделал такой:
[SqlExpression("CONTAINS({0}, {1})", ServerSideOnly = true)]
public static bool Contains(string field, string search)
{
    throw new LinqException("The 'Contains' is server side only expression.");
}

В идеале наверное хотелось бы тип параметра устанавливать равным аттрибуту DbType из схемы (если он вообще используется).

Сейчас поборол рабоче-крестьянским перекрытием OnBeforeOperation:
protected override void OnBeforeOperation(OperationType op)
{
    if (op == OperationType.ExecuteReader || op == OperationType.ExecuteNonQuery || op == OperationType.ExecuteScalar)
    {
        if (Command.CommandType != System.Data.CommandType.Text) return;

        foreach (System.Data.IDbDataParameter p in Command.Parameters)
        {
            if (p.DbType == System.Data.DbType.String)
            {
                p.DbType = System.Data.DbType.AnsiString;
            }
            else if (p.DbType == System.Data.DbType.StringFixedLength)
            {
                p.DbType = System.Data.DbType.AnsiStringFixedLength;
            }
        }
    }
}


Заодно хотелось бы узнать как это сделать правильнее.

Заранее спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.