SQL Server 查詢不區分大小寫,LINQ to Entities 同樣不區分;但記憶體中 LINQ 則嚴格區分。更隱蔽的是:SQL Server 甚至不區分全角半角,而記憶體 LINQ 區分,導致同一邏輯在資料庫層通過、記憶體層失效,引發主鍵衝突異常。
標籤服務 CNBlogsTagService:
tagNames = {"C++"}(全角),資料庫存 "c++"(半角),匹配成功,回傳既有實體。existedTags.Select(y=>y.TagName).Contains(x, ...) 區分全半角,認為 "C++" 不存在,嘗試新增。"C++"(視同 "c++")。// LINQ to Entities - 不區分全半角
var existedTags = _unitOfWork.Set<Tag>()
.Where(x => tagNames.Contains(x.TagName)).ToList();
// 記憶體 LINQ - 區分全半角
var createdTags = tagNames.Where(x => existedTags.Select(y => y.TagName)
.Contains(x, StringComparer.InvariantCultureIgnoreCase) == false)
.Select(x => new Tag { TagName = x }).ToList();
Microsoft.VisualBasicStrings.StrConv(x, VbStrConv.Narrow)var createdTags = tagNames.Where(x => existedTags.Select(y => Strings.StrConv(y.TagName, VbStrConv.Narrow))
.Contains(Strings.StrConv(x, VbStrConv.Narrow), StringComparer.InvariantCultureIgnoreCase) == false)
.Select(x => new Tag { TagName = x }).ToList();

以 VbStrConv.Narrow 統一正規化,為最低成本、最高相容性的解法。