【发布时间】:2016-02-28 01:14:09
【问题描述】:
问题
背景故事:我正在将遗留系统的所有 SQL 查询重写为 LINQ。
数据库没有我预期的那么干净。由于这些 SQL 记录中有许多包含空格或不同的情况,因此视为相同。
SELECT *
FROM fruit
WHERE name = @fruitname;
如果@fruitname 是apple,此查询将匹配以apple、_apple、APPLE_ 结尾的任何记录(其中_ 是一个空白字符)。
但是,这是我的用例中的预期行为。
另一方面,LINQ 字符串比较更精确。这让我很恼火,因为这些问题不断浮现在我的脑海中。
设置
FruitTableAdapter fruitsAdapter = new FruitTableAdapter();
MyGardenDataSet.FruitDataTable fruitsTable = fruitsAdapter.GetData();
方法
// Issue 1: Does not match, '_apple' or 'APPLE_'
var fruits1 = fruitsTable.Where(row=>row.name == fruitname);
// Issue 2: String Comparison with case insensitive (does not match 'APPLE')
var fruits2 = fruitsTable.Where(
row=>row.nameEquals(fruitname, StringComparison.OrdinalIgnoreCase));
// Issue 3: Trailing space with case insensitive
var fruits2 = fruitsTable.Where(
row=>row.name.Trim().Equals(fruitname.Trim(),
StringComparison.OrdinalIgnoreCase));
我不确定,但 SQL 查询与字符串比较可能存在很多问题。
是否有任何 SQL 感知 StringComparison?如何在 LINQ 中实现与 SQL 相同的字符串比较?
【问题讨论】:
-
linq 不区分大小写(没有 toUpper 或 toLower)stackoverflow.com/questions/5312585/…
-
是的,我见过很多这样的方法,但它们都没有结合
CaseInsensitive和Trim。但我还没有看到两者的结合。或者也许除了 2 之外还有更多不同 -
如果您使用 LINQ to 实体,您的比较 should already work as you want,因为您的 LINQ 表达式被转换为 SQL,因此使用 SQL 比较。如果您使用 LINQ 来反对,这将是开始担心性能的好时机......
-
@Heinzi 感谢您的链接。我相信现在的问题可能是这个
fruitsTable不再是SQL,而是已经变成了Object。这导致==的比较无法相应地工作。我现在正在调查这个问题。 -
欢迎来到 Linq,@Yeo :-)