【问题标题】:String comparison inside a LINQ query results in a nullable booelan?LINQ 查询中的字符串比较导致可为空的布尔值?
【发布时间】:2011-10-11 05:14:39
【问题描述】:

我有一个非常简单的数据库。它是各种配置项的名称/值存储,我试图简单地将它们全部取出并放入项目列表中。

我的 LINQ 查询如下所示:

configurationList = (from c in database.Configurations select new ViewConfigurationSettingModel(c.name, c.value){ IsChanged = (c.name == id) } ).ToArray();

ViewConfigurationSettingModel 类如下所示:

public class ViewConfigurationSettingModel
{
    public ViewConfigurationSettingModel(string name, string value)
    {
        this.Name = name;
        this.Value = value;
        this.IsChanged = false;
    }



    public string Name { get; private set; }
    public string Value { get; private set; }

    public bool IsChanged { get; set; }
}

执行 LINQ 查询时出现异常,因为“IsChanged”不是可空类型且不能包含空值。我很难过(c.name == id) 怎么会导致空值。这两个值都是字符串,但即使是与 null 的比较也应该导致简单的真假。

LINQ 是怎么回事,这突然导致空值?

【问题讨论】:

    标签: linq


    【解决方案1】:

    在 C# 中与 null 进行比较会导致简单的真/假,但在 SQL 中不会。我怀疑这就是这里的问题。假设 id 不为空,您可以尝试以下操作:

    IsChanged = c.name != null && (c.name == id)
    

    如果您可以使数据库中的 name 列不可为空,那也可能会有所帮助...

    【讨论】:

    • 这有点道理。你的第二个建议不起作用。编译器不接受它。错误表明您不能使用 '??'带有布尔类型。因此,编译器所做的事情与表达式运行时在运行时发生的事情之间似乎存在很大差异。
    • @Jeroen-bartEngelen:是的,我应该想到这一点。将编辑以删除该建议。有趣...
    猜你喜欢
    • 2021-11-05
    • 2011-08-21
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多