Чувствительный к регистру LINQ to DataSet - PullRequest
1 голос
/ 20 декабря 2011

У меня проблема со строго типизированным DataSet, показывающим чувствительность к регистру при использовании LINQ to DataSet для извлечения и фильтрации данных.В моем примере проекта я создал строго типизированный DataSet с именем DataSet1.Он содержит один DataTable под названием «Клиенты».Для создания экземпляра и заполнения я создаю пару строк (обратите внимание на регистр имен):

// Instantiate
DataSet1 ds = new DataSet1();

// Insert data
ds.Customers.AddCustomersRow(1, "Smith", "John");
ds.Customers.AddCustomersRow(2, "SMith", "Jane");

Далее я могу легко получить / отфильтровать, используя встроенную функциональность DataSet Select:

var res1 = ds.Customers.Select("LastName LIKE 'sm%'");
Console.WriteLine("DataSet Select: {0}", res1.Length);

DataSet Select: 2

Проблема начинается с попытки использовать LINQ to DataSet для выполнения той же операции:

var res2 = from c in ds.Customers where c.LastName.StartsWith("sm") select c;
Console.WriteLine("LINQ to DataSet: {0}", res2.Count());
LINQ to DataSet: 0

Я уже проверил экземплярное свойство CaseSensitive экземпляра DataSet, а также таблицу данных клиента.CaseSensitive свойство - оба ложные.Я также понимаю, что при использовании методологии Select DataSet выполняет фильтрацию, а запрос LINQ делает что-то еще.

Я надеялся и хотел, чтобы этот тип кода использовал его для модульного тестирования.наши скомпилированные запросы LINQ to SQL , поэтому я не могу изменить все текущие запросы для использования:

...where c.LastName.StartsWith("sm", StringComparison.CurrentCultureIgnoreCase) select c;

..., поскольку это изменяет запрос в SQL.Спасибо всем за любые предложения!

Ответы [ 2 ]

1 голос
/ 20 декабря 2011

LINQ to DataSets по-прежнему использует обычные управляемые функции, включая стандартный метод String.StartsWith.
Для этих методов принципиально невозможно знать свойство CaseSensitive DataTable.

Вместоможно использовать ExpressionVisitor, чтобы изменить все StartsWith (или аналогичные) вызовы для передачи StringComparison.CurrentCultureIgnoreCase.

0 голосов
/ 20 декабря 2011

Вы также можете использовать c.LastName.ToLower().StartsWith("sm", что позволит вам также получать записи в нижнем регистре. Удачи!

...