在linq中使用三元运算符来模拟基于CASE的串联

时间:2014-11-25 12:37:33

标签: c# linq entity-framework concat

我正在尝试构建一个查询,我必须根据第三个字段的值将两个特定字段连接在一起:

var query = (from ds in Datacenter.datastatus
                     where ds.visible == "y" 
                     select new 
                     { 
                         ds.Priority, 
                         ds.country.Country_Name, 
                         ds.DSFromDate,
                         ds.DSToDate,
                         receptiontype = ds.Datatype == "QH" ? Datacenter.reception_type.Where(x => x.Id_reception_type == ds.country.ReceptionType_IdQH).Select(x => x.Name) + " - " + ds.country.ReceptionCommentQH :
                         ds.Datatype != "QH" ? Datacenter.reception_type.Where(x => x.Id_reception_type == ds.country.ReceptionType_Id).Select(x => x.Name) + " - " + ds.country.ReceptionComment :
                         ""                       
                     }).ToList();

在我的情况下,根据if"数据类型"字段值等于" QH"或不。

运行代码时,我遇到了一个我不太了解的异常: " DBArithmeticExpression agruments必须具有数字公共类型"

我认为错误可能来自我进行字符串连接的方式,因此尝试了以下代码:

 receptiontype = ds.Datatype == "QH" ? String.Concat(Datacenter.reception_type.Where(x => x.Id_reception_type == ds.country.ReceptionType_IdQH).Select(x => x.Name), " - ", ds.country.ReceptionCommentQH) :
                         ds.Datatype != "QH" ?  String.Concat(Datacenter.reception_type.Where(x => x.Id_reception_type == ds.country.ReceptionType_Id).Select(x => x.Name), " - ", ds.country.ReceptionComment):
                         ""

但是由于我使用的是Entity框架,我得到的经典" LINQ to Entities无法识别方法' System.String Concat"因为它似乎无法将串联转换为SQL。

有关如何执行连接的任何提示?

1 个答案:

答案 0 :(得分:1)

问题是Datacenter.reception_type.Where(x => x.Id_reception_type == ds.country.ReceptionType_IdQH).Select(x => x.Name)是一个集合。而且你要尝试连接一个真正无意义的字符串,所以第一种方法失败了。

如果该集合应该只有一个项目,请使用.First().Single(),然后与+运算符连接。

如果该集合应该有多个你需要连接的项目......那么我就不知道。