1

我遇到了使用LINQ to DataSet检索和过滤数据的强类型DataSet显示区分大小写的问题。在我的示例项目中,我创建了一个名为 DataSet1 的强类型数据集。它包含一个名为Customers 的单曲。为了实例化和填充,我创建了几行(注意名称上的大小写):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的属性以及客户数据表的CaseSensitive属性——两者都是错误的。我还意识到,在使用该Select方法时,DataSet执行过滤和 LINQ 查询正在执行其他操作。

我对这种类型的代码的希望和渴望是用它来对我们编译的 LINQ to SQL查询进行单元测试,这样我就不能真正改变所有当前的查询来使用:

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

...因为这会更改 SQL 中的查询。感谢大家的任何建议!

4

2 回答 2

1

LINQ to DataSets 仍然使用正常的托管函数,包括标准String.StartsWith方法。
这些方法根本不可能知道 DataTable 的CaseSensitive属性。

相反,您可以使用 ExpressionVisitor 将所有StartsWith(或类似的)调用更改为 pass StringComparison.CurrentCultureIgnoreCase

于 2011-12-19T22:39:46.427 回答
0

您还可以使用c.LastName.ToLower().StartsWith("sm"which 将确保您还检索小写条目。祝你好运!

于 2011-12-20T15:10:12.130 回答