我的意思是,除了标准的LINQ到SQL转换为Transact-SQL(以及可能的解决方法)之外,还需要进行额外的处理
This
是关于我的邮政编码的。
情况1
string.Format()
LINQ表达式:
from h in HistoryData
select new { NewData = string.Format( "New Data: {0}", h.hisData ) };
提供程序上下文SQL:
SELECT [t0].[hisData] AS [arg0]
FROM [HistoryData] AS [t0]
DataContext.GetCommand()
方法,然后查看Transact-SQL并搜索
[arg0]
. 显然不太理想,所以我在寻找一个更强大的机制(可能是通过ExpressionTree访问者发现了什么东西)??)
在某些情况下使用第三个运算符似乎会返回一些Transact-SQL,这些SQL显然应用了一些post/client处理来获取正确的值。在下面的示例中,Im在LINQPad的上下文中运行(因此
Dump()
扩展方法可用)。当三级运算符处于活动状态时,似乎有两种情况需要后期处理:
-
当使用布尔变量和布尔字段时(下面的var testBool表达式)
-
当使用两个变量时,无论类型如何
不
这种情况使我吃惊,客户端处理是必需的。因此,除了学习如何正确地检测表达式何时需要在普通Transact-SQL之外进行额外的处理之外,如果有人知道为什么L2S不能像其他情况一样执行简单的CASE语句,更重要的是,可以使用一种可能的解决方法来避免任何客户端处理太棒了!
LINQ表达式:
var before9_1_2009 = DateTime.Today < new DateTime( 2009, 9, 1 );
var fiveThousand = 5000;
var tenThousand = 10000;
var testNumber =
Profiles.Where( p => p.pAuthID == "111111111" )
.Select( p => new { Number = before9_1_2009 ? fiveThousand : p.pKey } );
var cmd = GetCommand( testNumber );
cmd.CommandText.Dump( "Number Property: Works (i.e. evaluates on SQL Server)" );
var testString =
Profiles.Where( p => p.pAuthID == "111111111" )
.Select( p => new { String = before9_1_2009 ? "StringConstant" : p.pAuthID } );
cmd = GetCommand( testString );
cmd.CommandText.Dump( "String Property: Works (i.e. evaluates on SQL Server)" );
var testBool =
Profiles.Where( p => p.pAuthID == "111111111" )
.Select( p => new { Boolean = boolExp ? true : p.pProcessed } );
cmd = GetCommand( testBool );
cmd.CommandText.Dump( "Boolean Property: Has NULL AS [EMPTY] - Post Processing Needed" );
testNumber =
Profiles.Where( p => p.pAuthID == "111111111" )
.Select( p => new { Number = before9_1_2009 ? fiveThousand : tenThousand } );
cmd = GetCommand( testNumber );
cmd.CommandText.Dump( "Number Property (using two constants): Has NULL AS [EMPTY] - Post Processing Needed" );
提供程序上下文SQL(按顺序):
SELECT
(CASE
WHEN @p1 = 1 THEN @p2
ELSE [t0].[pKey]
END) AS [Number]
FROM [Profile] AS [t0]
WHERE [t0].[pAuthID] = @p0
字符串属性:Works(即在SQL Server上求值)
SELECT
(CASE
WHEN @p1 = 1 THEN CONVERT(NVarChar(255),@p2)
ELSE [t0].[pAuthID]
END) AS [String]
FROM [Profile] AS [t0]
WHERE [t0].[pAuthID] = @p0
布尔属性:具有空值[空]
SELECT NULL AS [EMPTY]
FROM [Profile] AS [t0]
WHERE [t0].[pAuthID] = @p0
Number属性(使用两个常量):具有NULL作为[EMPTY]
从[Profile]到[t0]
式中[t0].[pAuthID]=@p0
我的解决方法:我再次使用
方法,然后查看Transact-SQL并搜索
NULL AS [EMPTY]