导致此错误的原因:类型' System.String'不支持序列运算符

时间:2014-03-17 15:53:37

标签: c# asp.net

这是我的代码:

    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();

我刚刚补充说:&amp;&amp; !sp.KeyDeviceID.ToString()。包含( '〜')) 现在,我得到奇怪的错误消息:类型'System.String'不支持序列运算符。 在那之前,我没有问题。 现在,我收到这个神秘的错误消息。 由于数据库的大小,我需要将这一切都放在一个查询中。 有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我怀疑问题在于它使用Enumerable.Contains(string, char)(因为string实现了IEnumerable<char>),而你真的想要string.Contains(string)

只需将其更改为:

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

可以解决问题。

请注意,如果KeyDeviceID已经是字符串属性,我就会删除ToString()来电:

!sp.KeyDeviceID.Contains("~")

答案 1 :(得分:0)

您使用Linq进行SQL吗? Linq to SQL不支持数据类型的所有.Net功能。您可以使用SQLFunction来复制某些功能。如果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();