使用 Linq 连接合并数据表时出现错误无法隐式转换类型

我必须显示来自 xml 文件的聊天。但是当我加入 2 个合并表时,会出现一些错误。


错误是:


无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“System.Collections.Generic.IEnumerable”。存在显式转换(您是否缺少演员表?) D:\ChatReport\ChatReport\Default.aspx.cs 109 42 ChatReport


    public void  chatload2()

    {

        DataTable dtmsg = new DataTable();

        DataTable dtmsgtxt = new DataTable();

        DataTable dtmsgbody = new DataTable();

        DataTable dtuserinfo = new DataTable();

        DataTable dtnewparty = new DataTable();

        DataTable dtbodyuser = new DataTable();

        DataTable dtmerge = new DataTable();



        XmlTextReader xmlreader = new XmlTextReader(Server.MapPath("chattest.xml"));

        DataSet ds = new DataSet();


        ds.Locale = CultureInfo.InvariantCulture;

        ds.ReadXml(xmlreader);


        dtmsg = ds.Tables["message"];

        dtmsgtxt = ds.Tables["msgText"];

        dtuserinfo = ds.Tables["userInfo"];

        dtnewparty = ds.Tables["newParty"];


        dtbodyuser = dtnewparty.Copy();

        dtbodyuser.Merge(dtuserinfo);

        dtbodyuser.Columns.Remove("timeShift");

        dtbodyuser.Columns.Remove("eventid");

        dtbodyuser.Columns.Remove("chatTranscript_Id");

        dtbodyuser.Columns.Remove("personId");

        //dtbodyuser.Columns.Remove("newParty_Id");

        dtbodyuser.Columns.Remove("visibility");

        dtbodyuser.AcceptChanges();

        DataTable dt = dtbodyuser;


        dtmsgbody = dtmsg.Copy();

        dtmsgbody.Merge(dtmsgtxt);

        dtmsgbody.AcceptChanges();


        DataTable dt10 = new DataTable();


        IEnumerable<DataRow> query = from dtquer in dtmsgbody.AsEnumerable()

                                     join dtusr in dtbodyuser.AsEnumerable()

                                     on dtquer.Field<string>("userId") equals

                                     dtusr.Field<string>("userId")


                                     select new  



守候你守候我
浏览 224回答 1
1回答

猛跑小猪

您专门为 DataRow 类型的 IEnumerable 调用,然后在其中选择一个 IEnumerable 类型 Anonymous ——您需要指定匿名类型实际上是 DataRow 对象:IEnumerable<DataRow> query = from dtquer in dtmsgbody.AsEnumerable()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;join dtusr in dtbodyuser.AsEnumerable()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;on dtquer.Field<string>("userId") equals&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dtusr.Field<string>("userId")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;select new DataRow&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dtquer.Field<string>("userId"),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dtusr.Field<string>("userNick"),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dtquer.Field<int>("timeShift"),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dtquer.Field<int>("message_Id"),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dtquer.Field<string>("msgText_Text")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;];或者,使用“var”使“查询”对象不那么具体,因此您选择的类型可以决定 IEnumerable 的组成:var query = from dtquer in dtmsgbody.AsEnumerable()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;join dtusr in dtbodyuser.AsEnumerable()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;on dtquer.Field<string>("userId") equals&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dtusr.Field<string>("userId")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;select new&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; userId = dtquer.Field<string>("userId"),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; userNick = dtusr.Field<string>("userNick"),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; timeShift = dtquer.Field<int>("timeShift"),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; message_Id = dtquer.Field<int>("message_Id"),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; msgText_Text = dtquer.Field<string>("msgText_Text")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; };尽管您稍后将在 CopyToDataTable() 的代码中需要 DataRows,所以为了我的钱,我自己会采用第一种方法,而不是将“var”与我需要转换的匿名类型一起使用。编辑为了回应评论中提到的内容,摆脱对 Copy() 的依赖可能是更好的解决方案。通过定义表结构,然后将所需的值分配给适当的列,您可以绕过转换问题。DataTable dt10 = new DataTable();dt10.Columns.Add("UserId");dt10.Columns.Add("Nickname");dt10.Columns.Add("TimeShift");dt10.Columns.Add("MessageId");dt10.Columns.Add("MessageText");var query = from dtquer in dtmsgbody.AsEnumerable()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; join dtusr in dtbodyuser.AsEnumerable()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; on dtquer.Field<string>("userId") equals&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dtusr.Field<string>("userId")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; select new&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; userId = dtquer.Field<string>("userId"),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; userNick = dtusr.Field<string>("userNick"),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; timeShift = dtquer.Field<int>("timeShift"),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; message_Id = dtquer.Field<int>("message_Id"),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; msgText_Text = dtquer.Field<string>("msgText_Text")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;};var counter = 0;foreach (var row in query){&nbsp; &nbsp; &nbsp;dt10.NewRow();&nbsp; &nbsp; &nbsp;var newRow = dt10.Rows[counter];&nbsp; &nbsp; &nbsp;newRow.ItemArray[0] = row.userId;&nbsp; &nbsp; &nbsp;newRow.ItemArray[1] = row.userNick;&nbsp; &nbsp; &nbsp;newRow.ItemArray[2] = row.timeShift;&nbsp; &nbsp; &nbsp;newRow.ItemArray[3] = row.message_Id;&nbsp; &nbsp; &nbsp;newRow.ItemArray[4] = row.msgText_Text;&nbsp; &nbsp; &nbsp;counter++;&nbsp;}&nbsp;// Should end up with dt10 having all the results from the query above loaded into it没有依赖项就很难检查,但是您报告的初始错误不再显示在我的 Visual Studio 中。
打开App,查看更多内容
随时随地看视频慕课网APP