【问题标题】:Ternary operator with Linq-to-SQL causing problems?三元运算符与 Linq-to-SQL 导致问题?
【发布时间】:2011-06-01 07:24:45
【问题描述】:

我有以下 Linq-to-SQL 语句:

return db.Photos.SingleOrDefault(p => p.PhotoID == id
                                              && includePending ? true : p.Live);

对于 includePending 我传错了。在数据库中,除 2 张照片外,所有照片都为“实时”。

但是,它并没有按预期返回一张照片,而是返回数据库中除了 2 之外的所有照片! PhotoID 是一个主键(因此只能对一个项目为真),布尔逻辑状态为 FALSE AND TRUE = FALSE。那么这里发生了什么?为什么它忽略了我查询的p.PhotoID == id 部分?

【问题讨论】:

    标签: c# linq-to-sql


    【解决方案1】:

    我不记得full precedence rules,但你的情况相当于:

    p => (p.PhotoID == id && includePending) ? true : p.Live
    

    如果你想要:

    p => p.PhotoID == id && (includePending ? true : p.Live)
    

    只需使用后一种形式使其明确,甚至将其更改为不使用条件:

    p => p.PhotoID == id && (includePending || p.Live)
    

    我认为这更简单。我建议在这种情况下,即使优先规则对您有利,您也可以使用括号来使逻辑更清晰。

    你甚至可以使用两个 where 子句:

    .Where(p => p.PhotoID == id)
    .Where(p => includePending || p.live)
    

    甚至将第二个条件化:

    var query = ...
                   .Where(p => p.PhotoID == id);
    
    if (!includePending)
    {
        query = query.Where(p => p.live);
    }
    

    【讨论】:

    • +1。仅包括此优先级列表以供参考:msdn.microsoft.com/en-us/library/6a71f45d.aspx
    • @Mitch:是的。不过,我仍然不会费心死记硬背地学习它,因为像这样相对罕见的事情 - 我宁愿明确无论是哪种方式
    • 哈哈!我什至想不出一个像样的借口。猜猜这就是你工作到凌晨时会发生的事情。 ;) 感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 2015-05-20
    相关资源
    最近更新 更多