Линк к SQL конкатенации строк, где предложение генерирует глючный SQL - PullRequest
0 голосов
/ 08 июня 2011

Ответы на подобные вопросы у меня не работают.

Рассмотрим конкататный запрос этой строки:

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

результаты в sql ниже. это фактически не может найти совпадение по фамилии из-за первого оператора case.

Я прыгаю через всевозможные обручи, чтобы найти решение (вычисляемый столбец <забудь, udf <забудь, sp <забудь), вариации на тему где ... </p>

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

Есть идеи?

Ответы [ 2 ]

1 голос
/ 08 июня 2011

Глядя на сгенерированный SQL, похоже, что вам может потребоваться ввести дополнительные скобки:

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

Так как ?? имеет более низкий приоритет, чем + (по крайней мере, в сгенерированном SQL)

(К сожалению, единственная спецификация приоритета оператора C #, которую я могу найти в Интернете, относится к .NET 1.1 / 2003 , но, глядя на более поздние спецификации, кажется, что оператор слияния null появляется чуть выше Условного)

0 голосов
/ 08 июня 2011

Понял.Но это Fugly (как и sql).Конкат строки требует серьезного внимания!

.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''~'')))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...