为什么这个LinQ查询不像chars?

时间:2013-09-26 10:25:33

标签: c# linq linq-to-sql

我有一个LINQ查询,它抓取所需的所有数据并将其合并到一个数据传输对象中,一切正常但是当我将一个DTO的成员(这是一个char)设置为char值时抛出查询异常...

  

类型'System.ServiceModel.FaultException'的未处理异常   发生在mscorlib.dll

     

无法创建“System.Char”类型的常量值。在此上下文中仅支持原始类型或枚举类型。

请参阅下面的简化查询:

var result = (from c in db.Foster_Carers
              where c.foster_carer_id == id
              join fc in db.Individual_Carers on c.first_carer_id equals fc.individual_carer_id
              select new FosterCarerPersonalInfoDTO
              {
                  carer_title = fc.title,
                  carer_forenames = fc.forename,
                  carer_surname = fc.surname,                                
                  carer_gender = 'm'
              }).SingleOrDefault();

将性别设置为'm'只是不起作用,从语法上来说它没关系,只是在查询执行时没有!可能是什么问题?

3 个答案:

答案 0 :(得分:7)

这是EF的限制,因为char不是基本类型,有关原因的详细信息,请参阅此answer。限制本身也是documented

我建议您使用string

答案 1 :(得分:0)

我遇到过相同的问题,必须存储一个中间值并在Linq查询之外进行转换:

var intermediateResult = (from c in db.Foster_Carers
          where c.foster_carer_id == id
          join fc in db.Individual_Carers on c.first_carer_id equals fc.individual_carer_id
          select new 
          {
              oldResult = new FosterCarerPersonalInfoDTO
              {
                  carer_title = fc.title,
                  carer_forenames = fc.forename,
                  carer_surname = fc.surname,                                
              }
          ,   forConversion = new
              {
                  carer_gender = "m"
              }
          }).SingleOrDefault();

intermediateResult.oldResult.carer_gender = intermediateResult.forConversion.carer_gender[0];

var result = intermediateResult.oldResult;

答案 2 :(得分:0)

如果这是使用c#来自VS和MVC的,则 摆脱撇号并改为使用全引号。

使用

carer_gender = "m"

代替

carer_gender = 'm'

我发现C#将单引号解释为char类型而不是字符串。

我有

var _list = (from a in table where string.Concat(a.AbsenceReasonCodeID, "|", a.Description).ToUpper().Contains(vlsTerm) select new { value = a.field1, label = String.Concat(a.field1, " : ", a.field2) }).ToList();

当我使用单引号时,出现了char错误。用double代替它们解决了这个问题。