类似问题的答案对我不起作用。
考虑以下字符串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''~'')))