比较两个表时,特定转换在linq查询中无效

艾哈迈达

新成员
已加入
2014年1月22日
留言内容
2
编程经验
1-3
问题

LINQ查询中显示错误"特定的演员表无效"在System.Data.DataRowExtensions.Field [T]处System.Data.DataRowExtensions.UnboxT`1.ValueField(对象值)(DataRow行,字符串columnName)

LinqQuery给出错误
C#:
var query1 = (from x in table1.AsEnumerable()
                          join y in table2.AsEnumerable() on x.Field<int>("UnitCode") equals y.Field<int>("UnitCode")
                          where y.Field<decimal>("CurrentMeterReading") > x.Field<decimal>("CurrentMeterReading")
                          select new { UnitCode = x.Field<int>("UnitCode"), CurrentReading = x.Field<decimal>("CurrentMeterReading") }).ToList();
细节
当进行调试时,第一个数据表tableReadingExcelsheet从excel表中检索数据。

第二个数据表readfromInvoiceTablesql从sql中的wahinvoice表检索数据。

我需要在Excel工作表中获取当前读数小于

在Wahinvoice表中当前读取相同的UnitCode,然后显示在datagridview中。

C#:
private void button2_Click(object sender, EventArgs e)
        {
            DataTable tableReadingExcelsheet = new DataTable();
            tableReadingExcelsheet.Columns.AddRange(new DataColumn[] { new DataColumn("UnitCode", typeof(int)), new DataColumn("CurrentMeterReading", typeof(decimal)) });
            tableReadingExcelsheet = ShowdataFromExcel();
            DataTable readingfromInvoiceTablesql = new DataTable();
            readingfromInvoiceTablesql.Columns.AddRange(new DataColumn[] { new DataColumn("Serial", typeof(int)), new DataColumn("UnitCode", typeof(int)), new DataColumn("CurrentMeterReading", typeof(decimal)) });
            readingfromInvoiceTablesql = GetCurrentReadingUnitCodesql();
            var query1 = (from x in tableReadingExcelsheet.AsEnumerable()
                          join y in readingfromInvoiceTablesql.AsEnumerable() on x.Field<int>("UnitCode") equals y.Field<int>("UnitCode")
                          where y.Field<decimal>("CurrentMeterReading") > x.Field<decimal>("CurrentMeterReading")
                          select new { UnitCode = x.Field<int>("UnitCode"), CurrentReading = x.Field<decimal>("CurrentMeterReading") }).ToList();

            dataGridView1.DataSource = query1;
            dataGridView1.Refresh();

        }
//get data from excel success
public System.Data.DataTable ShowdataFromExcel()
        {
            string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";", txtpath.Text);

            OleDbConnection con = new OleDbConnection(connectionString);


            con.Open();

            string str = @"SELECT  [??? ?????????] as [UnitCode],[????? ??????]as[CurrentMeterReading] FROM  [Sheet5$] ";
            OleDbCommand com = new OleDbCommand();
            com = new OleDbCommand(str, con);
            OleDbDataAdapter oledbda = new OleDbDataAdapter();
            oledbda = new OleDbDataAdapter(com);
            DataSet ds = new DataSet();
            ds = new DataSet();
            oledbda.Fill(ds, "[Sheet5$]");
            con.Close();
            System.Data.DataTable dt = new System.Data.DataTable();
            dt = ds.Tables["[Sheet5$]"];
            return dt;


        }
//get data from sql wahinvoice success
public System.Data.DataTable GetCurrentReadingUnitCodesql()
        {
            sqlquery = @"select Serial,UnitCode, CurrentMeterReading
from( select Serial,UnitCode, CurrentMeterReading, ROW_NUMBER() OVER(PARTITION BY UnitCode ORDER BY Serial desc) as rn
from WAHInvoice) as a
where rn = 1";


            System.Data.DataTable tbCurrentReading = DataAccess.ExecuteDataTable(sqlquery);
            return tbCurrentReading;
        }
 

附件

  • 错误的linq query.jpg
    错误的linq query.jpg
    126.4 KB · Views: 61

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,525
地点
悉尼,澳大利亚
编程经验
10+
重复我在其他地方发布的内容,您是否检查过这两个数据表,以确保每个记录在UnitCode列中均具有“ int”值,在CurrentMeterReading列中具有“十进制”值?我的第一个猜测是,在那些列中的至少一列中包含NULL,尽管我不确定在那种情况下是否期望该特定错误消息。另一种可能性是,其中一列根本不包含指定的数据类型,例如UnitCode包含“字符串”值而不是“ int”值。

查看您在此处可辨别的屏幕截图,我想说的可能性包括,其中一列包含至少一个“字符串”值,或者CurrentMeterReading在第二张表中包含“ int”值,或者可能存在一个NULL我们看不到。
 
最佳 底部