实体框架区分大小写查询

时间:2017-09-15 12:21:49

标签: c# entity-framework linq case-sensitive

我有一个名为Post的表,其中有一个名为key的列:

  Id | Key | Title
 --------------------
   1 | WM  | First
 --------------------
   2 | wm  | Second

正如您所看到的,key的第一个Post值为WM(大写),第二个key值为wm(小写)。

当我使用以下代码执行查询时:

var post = await _posts.Where(o => o.Key == key).Select(o => new
    {
        id = o.Id,
        title = o.Title
    }).SingleOrDefaultAsync();

我使用值(wm和WM)传递key,但得到一个结果。第二个(wm)。

我已经搜索了解决方案并找到了这个questionanswer。在我搜索[CaseSensitive]后尝试使用答案并实施wm数据注释后,我收到了第一篇文章,当我搜索WM时,我得到了null。 我怎样才能解决这个问题,并用钥匙获得足够的帖子?

更新 生成的SQL查询:

   SELECT [Limit1].[C1]    AS [C1],
       [Limit1].[Id]    AS [Id],
       [Limit1].[Title] AS [Title]
FROM   (SELECT TOP (2) [Extent1].[Id]    AS [Id],
                       [Extent1].[Title] AS [Title],
                       1                 AS [C1]
        FROM   [dbo].[Posts] AS [Extent1]
        WHERE  ([Extent1].[Key] = 'wm' /* @p__linq__0 */)
                OR (([Extent1].[Key] IS NULL)
                    AND ('wm' /* @p__linq__0 */ IS NULL))) AS [Limit1]

1 个答案:

答案 0 :(得分:1)

我用同样的改变解决了这个问题:

  1. Key数据类型更改为varchar

  2. 并使用SqlQuery<T>执行SQL查询:

    var post = await _uow.Database
                .SqlQuery<PostUrlDto>(
                    "SELECT Id , Title FROM Posts WHERE [Key] = @postkey COLLATE SQL_Latin1_General_CP1_CS_AS",
                    new SqlParameter("postkey", postkey)).SingleOrDefaultAsync()