【问题标题】:Linq for SQL is replacing % with ~%Linq for SQL 正在将 % 替换为 ~%
【发布时间】:2010-11-24 11:16:11
【问题描述】:

我有一个包含 firstName、middleName 和 lastName 列的数据库。我正在使用 linq for sql 来查询这个表,我的输入是全名,

这是 linq 查询:

var n = customerName.Replace(" ", "%");        
var customers = from c in _db.tblCustomers
    where ((c.cSurName??"") + " " + (c.cMiddleName??"") + " "+ (c.cLastName??"")).Contains(n)
    select c;

以“Jan Rue”作为输入,这将产生以下 SQL where 子句:

    WHERE (((((COALESCE([t0].[cSurName],@p0)) + @p1) 
           + (COALESCE([t0].[cMiddleName],@p2))) + @p3) 
           + (COALESCE([t0].[cLastName],@p4))) LIKE @p5 ESCAPE ''~'''
   ,N'@p0 nvarchar(4000),@p1 nvarchar(1),@p2 nvarchar(4000),@p3 nvarchar(1),@p4 nvarchar(4000),@p5 nvarchar(11)'
   ,@p0=N'',@p1=N' ',@p2=N'',@p3=N' ',@p4=N'',@p5=N'%Jan~%Rue%'

它给了我 0 行。如果我删除 ~ 它工作得很好。我有什么办法可以强制 LINQ 不逃跑吗?

编辑解决方案:

where SqlMethods.Like(((c.cSurName ?? "") + " " + (c.cMiddleName ?? "") + " " + (c.cLastName ?? "")), "%" + n + "%")

编辑#2:找到更多信息: "Implementing a LINQ version of SQL’s LIKE Operator"

【问题讨论】:

    标签: sql linq c#-4.0


    【解决方案1】:

    这是在MS Connect 上记录的错误。请参阅“解决方法”选项卡。

    另见SO question

    【讨论】:

      【解决方案2】:

      问题是 Contains("Jan%Rue") 被翻译为“它应该包含文字字符串 'Jan%Rue'”,因此 Linq2Sql 有助于为您转义文本中的那个 '%'。只有你希望那个 '%' 表示 sql 通配符,所以你不想转义。

      您发现的文章看起来很有希望。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-10
        • 2019-09-02
        • 2017-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多