【问题标题】:Only primitive types or enumeration types are supported in this context C# Link此上下文中仅支持原始类型或枚举类型 C# Link
【发布时间】:2020-02-13 21:58:29
【问题描述】:

我有一个 linq 查询,我用它来聚合一些带有一些操作 [替换] 的字符串。 所以,我有两个版本的查询;其中一个工作,另一个不工作[抛出异常],我想知道它为什么不工作。

工作查询:

string.Join("",Context.Table1.Where(c => c.Column1== Value1)
          .Select(c => c.Column2.Replace("~", "~" + Environment.NewLine)).ToList());

不工作的查询:

string.Join("",Context.Table1.Where(c => c.Column1== Value1)
       .Select(c => c.Column2.Replace("~", "~" + (char)(13) + (char)(10)).ToList());

它们之间的唯一区别是 Environment.NewLine 和 (char)(13) + (char)(10)

更新: 这是因为 char 在 EntityFramework 中不是有效的原始类型。有几篇文章详细解释了这一点:

  1. Why does this LinQ query not like chars?
  2. How do I map a char property using the Entity Framework 4.1 "code only" fluent API?

【问题讨论】:

  • Environment.NewLine 有什么问题?

标签: c# linq


【解决方案1】:

你知道 C# char 是 16 位的吗?因此,例如与 c++ 不同..

你应该使用:(类似代码)

string.Join("",Context.Table1.Where(c => c.Column1== Value1)
       .Select(c => c.Column2.Replace("~", "~" + "\r" + "\n").ToList());

【讨论】:

  • 我知道 char 在 C# 中是 16 位的。我想知道 Environment.NewLine、(char)(13) + (char)(10) 和 "\r\n" 之间有什么区别。为什么你说我应该使用“\r\n”。是什么让 "\r\n" 比其他两个更好?
  • 这与 char 是 16 位无关,因为 ”~" + (char)13 + (char)10 将是一个有效的字符串,尽管比 "~\r\n" 可读性差(并且可能效率低)。出现问题是因为 LINQ 提供程序可能不支持此类类型转换,因此无法将其转换为底层 SQL 语法。
  • @AlexSkalozub,感谢您指出正确的方向。我发现了几篇解释根本原因的帖子:stackoverflow.com/questions/19025665/…stackoverflow.com/questions/6760765/…。这是 EntityFramework 的限制,其中 char 不是有效的原始类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多