实体框架 - 查询单个列时,如何区分无结果和带有NULL值的结果?

时间:2017-08-30 19:27:38

标签: c# entity-framework linq

让我们说我在EF中有一个名为vw_Project的类,其中包含类型为string的属性ProjectTitle以及其他属性。我想运行一个有效的LINQ查询,它只查询我的结果中第一个记录的第一列(第一个" cell",类似于SqlCommand.ExecuteScalar)。我可能写这样的东西:

string projectTitle = context.vw_Projects
    .Where(p => p.ProjectID == projID)
    .Select(p => p.ProjectTitle)
    .FirstOrDefault();

问题是,我无法判断我的查询结果是否为零,或者是否只为该NULL列获得了一个varchar值的结果。

我总是可以查询整个对象来做出决定,然后将ProjectTitle列提取到内存中的字符串变量中,但是我要查询一堆我不需要的列,这是一个糟糕的解决方案。这看起来像这样:

string projectTitle;
vw_Project project = context.vw_Projects
    .Where(p => p.ProjectID == projID)
    .FirstOrDefault();

if (project != null)
{
    projectTitle = project.ProjectTitle;
}
else
{
    throw new Exception("Invalid Project ID");
}

如何在不查询其他列或行的情况下进行此确定?

1 个答案:

答案 0 :(得分:2)

如果您创建的内联匿名类型只包含您需要的属性,您仍然可以确定是否获得零结果或NULL记录。

string projectTitle;
var result = context.vw_Projects
    .Where(p => p.ProjectID == projID)
    .Select(p => new { p.ProjectTitle })
    .FirstOrDefault();

if (result != null)
{
    projectTitle = result.ProjectTitle;
}
else
{
    throw new Exception("Invalid Project ID");
}

如果查询得到结果,result实例将不为null,无论内部ProjectTitle属性是否为空。