实体框架4.1-Linq到SQL字符串串联,其中子句生成有缺陷的SQL



类似问题的答案对我不起作用。

考虑以下字符串concat查询:

.Where(c => (
              c.FirstName ?? String.Empty +
              c.LastName ?? String.Empty +
              c.CompanyName ?? String.Empty).Contains(searchText)

结果显示在下面的sql中。由于使用了第一个case语句,这实际上无法在姓氏上找到匹配项。

我正在跳过各种各样的障碍来寻找解决方案(计算列<忘记它,udf<忘了它,sp<遗忘它),关于where主题的变体。。。

CASE 
            WHEN ([Extent3].[FIRST_NM] IS NULL) 
                THEN 
                    CASE 
                        WHEN (@p__linq__0 + [Extent3].[LAST_NM] IS NULL) 
                            THEN 
                                CASE 
                                    WHEN (@p__linq__1 + [Extent3].[COMPANY_NM] IS NULL) 
                                        THEN @p__linq__2 
                                ELSE @p__linq__1 + [Extent3].[COMPANY_NM] 
                                END 
                    ELSE @p__linq__0 + [Extent3].[LAST_NM] 
                    END 
        ELSE [Extent3].[FIRST_NM] 
        END LIKE @p__linq__3 ESCAPE N''~'')

有什么想法吗?

查看生成的SQL,您可能需要引入更多括号:

.Where(c => (
          (c.FirstName ?? String.Empty) +
          (c.LastName ?? String.Empty) +
          (c.CompanyName ?? String.Empty)).Contains(searchText)

由于看起来??的优先级低于+(至少在生成的SQL中)

(不幸的是,我能在网上找到的唯一C#运算符优先级规范是针对.NET 1.1/2003的,但在后来的规范中,空合并运算符似乎出现在Conditional之上)

明白了。但这是Fugly(sql也是)。字符串concat需要一些认真的注意!

.Where(c => (
              ((c.FirstName ?? String.Empty).Length > 0 && (c.FirstName ?? String.Empty).Contains(searchText)) ||
               ((c.LastName ?? String.Empty).Length > 0 && (c.LastName ?? String.Empty).Contains(searchText)) ||
                ((c.CompanyName ?? String.Empty).Length > 0 && (c.CompanyName ?? String.Empty).Contains(searchText))
                )  
              )

产生

AND (((( CAST(LEN(CASE WHEN ([Extent3].[FIRST_NM] IS NULL) THEN @p__linq__0 ELSE [Extent3].[FIRST_NM] END) AS int)) > 0) 
        AND (CASE WHEN ([Extent3].[FIRST_NM] IS NULL) THEN @p__linq__1 ELSE [Extent3].[FIRST_NM] END LIKE @p__linq__2 ESCAPE N''~'')) 
        OR ((( CAST(LEN(CASE WHEN ([Extent3].[LAST_NM] IS NULL) THEN @p__linq__3 ELSE [Extent3].[LAST_NM] END) AS int)) > 0) 
        AND (CASE WHEN ([Extent3].[LAST_NM] IS NULL) THEN @p__linq__4 ELSE [Extent3].[LAST_NM] END LIKE @p__linq__5 ESCAPE N''~'')) 
        OR ((( CAST(LEN(CASE WHEN ([Extent3].[COMPANY_NM] IS NULL) 
        THEN @p__linq__6 ELSE [Extent3].[COMPANY_NM] END) AS int)) > 0) 
        AND (CASE WHEN ([Extent3].[COMPANY_NM] IS NULL) THEN @p__linq__7 ELSE [Extent3].[COMPANY_NM] END LIKE @p__linq__8 ESCAPE N''~'')))

相关内容

  • 没有找到相关文章

最新更新