【问题标题】:what causes this error: Sequence operators not supported for type 'System.String'导致此错误的原因:“System.String”类型不支持序列运算符
【发布时间】:2014-03-17 23:58:48
【问题描述】:

这是我的代码:

    IEnumerable<DataAccessLayer.SQLPendingEventRecord> dataset1 = _v3Context.SQLPendingEvents
                     .Where(sp => sp.EventType.ToString() == str100w && sp.EventDateTime > dtStartDate && !sp.KeyDeviceID.ToString().Contains('~'))
                     .AsEnumerable() // further processing occurs on client
                     .Select((sp, index) => new DataAccessLayer.SQLPendingEventRecord
                     {
                         ID = index + 1,
                         KeyDeviceID=sp.KeyDeviceID,
                         UpdateTime=sp.UpdateTime,
                         EventClass=sp.EventClass,
                         EventCode=sp.EventCode,
                         EventType=sp.EventType,
                         EventDateTime=Convert.ToDateTime(sp.EventDateTime),
                         KeyPropertyID=Convert.ToInt32 (sp.KeyPropertyID),
                         KeyEntityID=Convert.ToInt32 (sp.KeyEntityID),
                         EventText=sp.EventText,
                         KeyUserID=sp.KeyUserID,
                         //sp.EventImage,
                         TaskType=sp.TaskType,
                         TaskSubType=sp.TaskSubType,
                         UniqueTaskID=sp.UniqueTaskID
                     }).ToList();

我刚刚添加了:&& !sp.KeyDeviceID.ToString().Contains('~')) 现在,我收到奇怪的错误消息:“System.String”类型不支持序列运算符。 在此之前,我没有任何问题。 现在,我收到了这个神秘的错误信息。 由于数据库的大小,我需要将所有这些都放在一个查询中。 有什么想法吗?

【问题讨论】:

  • 对于您正在使用的提供程序,Contains() 可能没有等效的 SQL。
  • KeyDeviceId的类型是什么?
  • 这一行工作正常: dataset1 = dataset1.Where(sp => !sp.KeyDeviceID.ToString().Contains('~')).ToList();
  • KeyDeviceId 是一个字符串。
  • 那你为什么打电话给ToString呢?

标签: c# asp.net


【解决方案1】:

我怀疑问题在于它使用了Enumerable.Contains(string, char)(因为string 实现了IEnumerable&lt;char&gt;),而你真正想要的是string.Contains(string)

只需将其更改为:

!sp.KeyDeviceID.ToString().Contains("~")

可以解决问题。

请注意,如果 KeyDeviceID 已经是一个字符串属性,我会去掉 ToString() 调用:

!sp.KeyDeviceID.Contains("~")

【讨论】:

  • @SteveStaple:我怀疑这会产生与'~' 参数相同的错误。 (你发现我改变了文字类型吗?)
  • 我让它工作,通过将“~”放在一个常量中:string strTilde =“~”; IEnumerable dataset1 = _v3Context.SQLPendingEvents .Where(sp => sp.EventType.ToString() == str100w && sp.EventDateTime > dtStartDate && !sp.KeyDeviceID.Contains (strTilde))
  • @SteveStaple:做什么? (请记住,Stack Overflow 不仅仅是为了帮助您,而是为了帮助其他人以后遇到同样的问题。)
  • Jon Skeet - Enter 按钮在我准备好之前保存了我的消息。没有换行符!
  • @SteveStaple:这听起来很可疑 - 你绝对确定当你使用字符串文字时它失败了吗?您可能还没有使用字符文字来运行代码?
【解决方案2】:

您使用的是 Linq to SQL 吗? Linq to SQL 不支持数据类型的所有 .Net 功能。您可以使用 SQLFunctions 来复制某些功能。如果 sp.KeyDeviceID 不是字符串,则在使用 Linq to SQL 时使用 ToString() 会引发错误。 试试看

IEnumerable<DataAccessLayer.SQLPendingEventRecord> dataset1 = _v3Context.SQLPendingEvents
                     .Where(sp => sp.EventType.ToString() == str100w && sp.EventDateTime > dtStartDate && !**SQLFunctions.CharIndex(sp.KeyDeviceID,"~")>0)**
                     .AsEnumerable() // further processing occurs on client
                     .Select((sp, index) => new DataAccessLayer.SQLPendingEventRecord
                     {
                         ID = index + 1,
                         KeyDeviceID=sp.KeyDeviceID,
                         UpdateTime=sp.UpdateTime,
                         EventClass=sp.EventClass,
                         EventCode=sp.EventCode,
                         EventType=sp.EventType,
                         EventDateTime=Convert.ToDateTime(sp.EventDateTime),
                         KeyPropertyID=Convert.ToInt32 (sp.KeyPropertyID),
                         KeyEntityID=Convert.ToInt32 (sp.KeyEntityID),
                         EventText=sp.EventText,
                         KeyUserID=sp.KeyUserID,
                         //sp.EventImage,
                         TaskType=sp.TaskType,
                         TaskSubType=sp.TaskSubType,
                         UniqueTaskID=sp.UniqueTaskID
                     }).ToList();

【讨论】:

  • 新问题已得到解答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多