2016-03-07 54 views
2

我一直在努力寻找,因为一部分几个小时了一个解决方案,我觉得我的大脑正在帮助。我有以下的LINQ查询。如何获得相同的功能ISNULL在LINQ查询

DropDownListItem item = (
        from c in context.Practitioners 
        where c.PractitionerID == id 
        select new DropDownListItem 
        { 
         Id = c.PractitionerID, 
         DisplayValue = c.FirstName + " " + c.MiddleName + " " + c.LastName, 
         IsActive = c.IsActive, 
         DisplayOrder = c.PractitionerID, 
         CreatedById = new Guid("COFFEEOO-LOVE-LIFE-LOVE-C0FFEEC0FFEE"), 
         CreatedDate = c.CreatedDate, 
        }).FirstOrDefault() ?? new DropDownListItem(); 

       response.Data = item; 

当c.MiddleName可能为空时,会有instaces。我如何在这个查询中处理它,以便如果c.MiddleName为空,我可以给它分配一个空白的“”字符串? 这是我已经尝试过,但没有解决的。 - 创建扩展来检查IsNullOrEmpty。我发现这在LINQ查询中不起作用。 - 试图做类似c.MiddleName.ToString(),它并没有为LINQ查询工作,要么转换c.Middle字符串。 请给我更多的方向,我应该走向。谢谢!

回答

0

您可以检查空值和空字符串,而不是使用任何方法是LINQ到实体不理解(Trim将被转换为SQL):

DisplayValue = c.FirstName + " " + ((c.MiddleName == null || c.MiddleName.Trim() == string.Empty) ? string.Empty : (c.MiddleName + " ")) + c.LastName, 
+0

这给了我一个异常说“无法转换类型'System.Boolean为键入‘System.Object的’。LINQ到实体仅支持铸造EDM原始或枚举类型。” –

+0

谢谢@sarvana。编辑完成后它完美无缺! –

+0

这个工程太:DisplayValue =(c.FirstName ??的String.Empty)+ “” +(c.MiddleName ??的String.Empty)+ “” +(c.LastName ??的String.Empty) – Coding4Fun

2

我假设你通过c.MiddleName是什么意思空是c.MiddleName为空(因为如果它是一个空字符串,你的问题没有意义:p)。

如果情况确实如此尝试写c.MiddleName ?? ""

这意味着,如果??左侧部分为null,则使用表达式的右侧部分

更多的文档

,看看https://msdn.microsoft.com/en-us/library/ms173224.aspx你就必须改变这种方式代码:

DropDownListItem item = (
        from c in context.Practitioners 
        where c.PractitionerID == id 
        select new DropDownListItem 
        { 
         Id = c.PractitionerID, 
         DisplayValue = (c.FirstName ?? "") + " " + (c.MiddleName ?? "") + " " + (c.LastName ?? ""), 
         IsActive = c.IsActive, 
         DisplayOrder = c.PractitionerID, 
         CreatedById = new Guid("COFFEEOO-LOVE-LIFE-LOVE-C0FFEEC0FFEE"), 
         CreatedDate = c.CreatedDate, 
        }).FirstOrDefault() ?? new DropDownListItem(); 

       response.Data = item; 

为了不认为??运算符具有C#中最低优先级之一。 在C#这里https://msdn.microsoft.com/en-us/library/6a71f45d.aspx

+0

我用你的建议。现在它只是返回姓氏。我正在看的这个人有姓和名,没有中间名。所以我期望显示值是名和姓。 –

+0

对不起,我打算说现在只返回名字。没有姓,即使这个人有姓氏 –

+1

它应该是'(c.FirstName ??“”“)+”“+(c.MiddleName ??”“)+”“+(c.LastName ??”“ )'。现在它和'c.FirstName? (“”+“”+ c.MiddleName ??(“”+“”+ c.LastName ??“”))' – juharr

0

检查经营者优先试试这个

DisplayValue = (c.FirstName?? string.Empty) + " " + (c.MiddleName ?? string.Empty) + " " + (c.LastName?? string.Empty) 
+0

这只是返回名字,即使此记录具有姓氏。如果记录已经列出,我会期望名字和姓氏。 –

+0

我编辑了我的答案,现在工作正常 – Coding4Fun

1

我有点困惑你的问题。你正在创建一个字符串,所以即使c.MiddleName为空,它也应该被解释为一个空字符串。

你也可以试试这个:

 DisplayValue = (c.MiddleName != null) ? 
c.FirstName + " " + c.MiddleName + " " + c.LastName : 
c.FirstName + " " + c.LastName, 

但几乎所有其他的答案都非常相似。

作为一个说明,你缺少括号后面select new DropDownListItem,所以这可能是问题。

+0

查询似乎是EF。这意味着它被转换为SQL,其中连接一个'null'字符串值的行为将不同于它在C#中的行为。当使用对象初始值设定项时,你也不需要括号'()'。 – juharr