代码之家  ›  专栏  ›  技术社区  ›  Sanish Joseph

为什么Linq不能搜索阿拉伯语文本?

  •  4
  • Sanish Joseph  · 技术社区  · 8 年前

    我的数据库中有阿拉伯语文本和英语文本。我试图根据用户输入的文本从数据库中搜索。它可以是英语或阿拉伯语。

      results = results.Where(c => c.ResourceValue.Contains(AnyText));
    

    当它是英语时,我得到了正确的结果,但当它是阿拉伯语时,它返回的结果是以DB为单位的?s。这些结果都是垃圾。

    我假设问题是阿拉伯文本被比较为“??”s”,而Linq to实体返回的结果为“?”???是的。

    我该怎么办?

    更新:

    我已经使用SQL profiler来查看针对数据库运行的查询。正如人们所怀疑的那样,阿拉伯语输入[搜索文本]并不彻底,但它已经变成了“?”???s

    exec sp_executesql N'SELECT  
    [Extent1].[ResourceValue] AS [ResourceValue]  
    FROM (SELECT      
    [Table].[ResourceValue] AS [ResourceValue]   
    FROM [dbo].[Table] AS [VpStringResource])
    AS [Extent1]  WHERE ([Extent1].[ChannelID] IN (@p__linq__0,0)) AND (( CAST(LEN([Extent1].
    [ResourceValue]) AS int)) <> 0) AND ([Extent1].[ResourceValue] LIKE @p__linq__1 ESCAPE 
    ''~'')',N'@p__linq__0 smallint,@p__linq__1 varchar(8000)',@p__linq__0=2,
    @p__linq__1='%??????%'
    

    为了再现该问题,

    正如我提到的,您可以使用任何sql表。添加nVarchar(max)类型的列。在表格中添加一些阿拉伯文字。使用C#中的实体框架,并尝试使用问题中的行。喜欢

    Context.Table.Where(c => c.ResourceValue.contains("اختبار")) 
    
    1 回复  |  直到 8 年前
        1
  •  3
  •   Sanish Joseph    8 年前

    经过一番研究,我找到了自己问题的解决方案。

    results = results.Where(c => c.ResourceValue.Contains(EntityFunctions.AsUnicode(AnyText)));
    

    using System.Data.Entity.Core.Objects;

    希望这对某人有所帮助。感谢您对搜索解决方案的所有评论和提示。