为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
守候你守候我 2022-06-12 10:27:48
我必须显示来自 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  
查看完整描述

1 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

您专门为 DataRow 类型的 IEnumerable 调用,然后在其中选择一个 IEnumerable 类型 Anonymous ——您需要指定匿名类型实际上是 DataRow 对象:


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 DataRow

                                 [


                                     dtquer.Field<string>("userId"),

                                     dtusr.Field<string>("userNick"),

                                     dtquer.Field<int>("timeShift"),

                                     dtquer.Field<int>("message_Id"),

                                     dtquer.Field<string>("msgText_Text")


                                 ];

或者,使用“var”使“查询”对象不那么具体,因此您选择的类型可以决定 IEnumerable 的组成:


var query = from dtquer in dtmsgbody.AsEnumerable()

                                 join dtusr in dtbodyuser.AsEnumerable()

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

                                 dtusr.Field<string>("userId")


                                 select new  

                {


                    userId = dtquer.Field<string>("userId"),

                    userNick = dtusr.Field<string>("userNick"),

                    timeShift = dtquer.Field<int>("timeShift"),

                    message_Id = dtquer.Field<int>("message_Id"),

                    msgText_Text = dtquer.Field<string>("msgText_Text")



                };

尽管您稍后将在 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()

            join dtusr in dtbodyuser.AsEnumerable()

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

            dtusr.Field<string>("userId")


            select new

            {


                userId = dtquer.Field<string>("userId"),

                userNick = dtusr.Field<string>("userNick"),

                timeShift = dtquer.Field<int>("timeShift"),

                message_Id = dtquer.Field<int>("message_Id"),

                msgText_Text = dtquer.Field<string>("msgText_Text")



             };


var counter = 0;


foreach (var row in query)

{

     dt10.NewRow();

     var newRow = dt10.Rows[counter];


     newRow.ItemArray[0] = row.userId;

     newRow.ItemArray[1] = row.userNick;

     newRow.ItemArray[2] = row.timeShift;

     newRow.ItemArray[3] = row.message_Id;

     newRow.ItemArray[4] = row.msgText_Text;


     counter++;

 }


 // Should end up with dt10 having all the results from the query above loaded into it

没有依赖项就很难检查,但是您报告的初始错误不再显示在我的 Visual Studio 中。


查看完整回答
反对 回复 2022-06-12
  • 1 回答
  • 0 关注
  • 223 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号