【问题标题】:Linq is weird or I'm stupid?Linq很奇怪还是我很愚蠢?
【发布时间】:2009-02-20 18:59:10
【问题描述】:

为什么会这样:

result = (from e in db.CampaignCodes where e.Code.Equals("") && 
e.Domain.Equals(null) select e).FirstOrDefault();

但不是(结果为空):

String code = "";
String domain = null;

result = (from e in db.CampaignCodes where e.Code.Equals(code) &&
 e.Domain.Equals(domain) select e).FirstOrDefault();

??

【问题讨论】:

    标签: c# linq-to-sql


    【解决方案1】:

    扩展伊恩的回答:

    根据 e.Domain.Equals() 的重载,传递空字符串变量可能会与传递空值不同?我不确定这里的规则是什么,但我怀疑编译器可能更喜欢 e.Domain.Equals(object variable) 当明确给出“just” null 而不是已设置为空的字符串变量?

    【讨论】:

      【解决方案2】:

      这听起来确实很奇怪。 LINQ to SQL 可能会注意到从变量中获取值和从常量中获取值之间的区别,但我没想到它会产生任何区别。

      我强烈建议,每当 LINQ to SQL 出现异常行为时,打开上下文日志记录并查看它在每种情况下实际执行的查询。

      编辑:关于重载方面的其他答案非常有趣。如果您在第二个查询中将domain 变量声明为object 类型而不是string,或者在第一个查询中将null 转换为string,会发生什么情况?

      【讨论】:

      • 还没有开始使用 LinqToSql,我的回答是假设 - 这可能意味着我过于复杂了!你的肯定是更“实用”的答案=)
      • 当然,打开登录应该至少能解开一些的谜团:)
      • 我不记得到底是什么问题,但我们确实在比较空值时遇到了一些问题。 SQL 比较为 null 的内容与 C# 中的做法略有不同。
      • 是的,SQL 空值不等于其他任何值。
      • @Svish @Rob @Niels @Jon:见stackoverflow.com/questions/682429/…
      【解决方案3】:

      空字符串 - 域 - 与仅传递 null 不同吗?

      【讨论】:

        【解决方案4】:

        通过日志记录下来,这是我的结果:

        我得到以下结果:

        作品:

        (from e in CampaignCodes where e.Code.Equals(code) && e.Domain.Equals(null) select e).FirstOrDefault().Dump();
        
        SELECT TOP (1) [t0].[Id], [t0].[Code], [t0].[Domain], [t0].[ClientId], [t0].[CampaignId], [t0].[PathId], [t0].[DescriptionText], [t0].[DeleteFlag], [t0].[Created]
        FROM [CampaignCodes] AS [t0]
        WHERE ([t0].[Code] = @p0) AND ([t0].[Domain] IS NULL)
        -- @p0: Input NVarChar (Size = 0; Prec = 0; Scale = 0) []
        -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8
        

        不起作用:

        (from e in CampaignCodes where e.Code.Equals(code) && e.Domain.Equals(domain) select e).FirstOrDefault().Dump();
        
        SELECT TOP (1) [t0].[Id], [t0].[Code], [t0].[Domain], [t0].[ClientId], [t0].[CampaignId], [t0].[PathId], [t0].[DescriptionText], [t0].[DeleteFlag], [t0].[Created]
        FROM [CampaignCodes] AS [t0]
        WHERE ([t0].[Code] = @p0) AND ([t0].[Domain] = @p1)
        -- @p0: Input NVarChar (Size = 0; Prec = 0; Scale = 0) []
        -- @p1: Input NVarChar (Size = 0; Prec = 0; Scale = 0) [Null]
        -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.
        

        8

        所以

        通过将我的 linq2sql 重写为:

        (from e in CampaignCodes where e.Code.Equals(code) && ((domain==null && e.Domain.Equals(null))||e.Domain.Equals(domain)) select e).FirstOrDefault().Dump();
        

        我明白了:

        SELECT TOP (1) [t0].[Id], [t0].[Code], [t0].[Domain], [t0].[ClientId], [t0].[CampaignId], [t0].[PathId], [t0].[DescriptionText], [t0].[DeleteFlag], [t0].[Created]
        FROM [CampaignCodes] AS [t0]
        WHERE ([t0].[Code] = @p0) AND ([t0].[Domain] = @p1)
        -- @p0: Input NVarChar (Size = 4; Prec = 0; Scale = 0) [test]
        -- @p1: Input NVarChar (Size = 14; Prec = 0; Scale = 0) [mydomain.se]
        -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8
        

        当域不为空并且:

        SELECT TOP (1) [t0].[Id], [t0].[Code], [t0].[Domain], [t0].[ClientId], [t0].[CampaignId], [t0].[PathId], [t0].[DescriptionText], [t0].[DeleteFlag], [t0].[Created]
        FROM [CampaignCodes] AS [t0]
        WHERE ([t0].[Code] = @p0) AND (([t0].[Domain] IS NULL) OR ([t0].[Domain] = @p1))
        -- @p0: Input NVarChar (Size = 4; Prec = 0; Scale = 0) [test]
        -- @p1: Input NVarChar (Size = 0; Prec = 0; Scale = 0) [Null]
        -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8
        

        什么时候。

        但我希望有一个很好的方法来解决这个问题......

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-07-08
          • 1970-01-01
          • 1970-01-01
          • 2021-10-29
          • 2013-09-15
          • 1970-01-01
          相关资源
          最近更新 更多