2011-06-08 69 views
0

類似問題的答案不適用於我。Linq到SQL字符串連接where子句生成越野車sql

考慮這個字符串連接查詢:

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

結果在下面的SQL。由於第一個案例陳述,這實際上未能找到姓氏上的匹配。

我跳通過各種箍,以找到一個解決方案(計算列<算了吧,UDF <算了吧,SP <忘了),在那裏主題的變化...

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''~'') 

有任何想法嗎?

回答

0

明白了。但這是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''~''))) 
1

望着生成的SQL,它看起來像你可能需要推出更多包圍:

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

因爲它看起來像??+優先級低(至少,在生成的SQL)

(不幸的是,我可以在網上找到的唯一C#運算符優先級規範是.NET 1.1/2003,但在稍後的規範中看來,看起來空合併運算符看起來正好在條件之上)

+0

新的支架都沒有效果很遺憾 – 2011-06-08 10:22:06