Привет!
Столкнулся с такой проблемой — запросы крайне медленно исполняются (раз в 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;
}
}
}
}
Заодно хотелось бы узнать как это сделать правильнее.
Заранее спасибо.