代码之家  ›  专栏  ›  技术社区  ›  Terry

如何确定IQueryable表达式是否需要额外的处理

  •  2
  • Terry  · 技术社区  · 16 年前

    我的意思是,除了标准的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() 扩展方法可用)。当三级运算符处于活动状态时,似乎有两种情况需要后期处理:

    1. 当使用布尔变量和布尔字段时(下面的var testBool表达式)
    2. 当使用两个变量时,无论类型如何

    这种情况使我吃惊,客户端处理是必需的。因此,除了学习如何正确地检测表达式何时需要在普通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]

    1 回复  |  直到 7 年前
        1
  •  0
  •   Tony    7 年前

    快速观察:

    1. 你在哪里声明了boolExp变量?
    2. 数字属性(使用两个常量):2 var 对象返回不明确的类型。