【问题标题】:How to solve error - unable to evaluate the expression. Operation not supported. Unknown error: 0x80070057如何解决错误 - 无法评估表达式。不支持操作。未知错误:0x80070057
【发布时间】:2019-04-13 17:32:52
【问题描述】:

我正在尝试将 3 个实体表与仅从这些表中的几列的填充数据连接到数据表中

DataTable dttable = new DataTable();

dttable.Columns.Add("billno", typeof(String));
dttable.Columns.Add("date", typeof(DateTime));
dttable.Columns.Add("time", typeof(String));
dttable.Columns.Add("sname", typeof(String));
dttable.Columns.Add("name", typeof(String));
dttable.Columns.Add("qty", typeof(Decimal));
dttable.Columns.Add("rate", typeof(Decimal));


var rows = from mobjbmast in Context.bmasts.AsEnumerable()
           join mobjbtran in Context.btrans
           on mobjbmast.billno equals mobjbtran.billno
           join mobjwaiter in Context.waiters
           on mobjbmast.scode equals mobjwaiter.code
           where mobjbmast.billno == mbillno
           select dttable.LoadDataRow(new object[]
           {
                 mobjbmast.billno,
                 mobjbmast.date,
                 mobjbmast.time,
                 mobjwaiter.name,
                 mobjbtran.name,
                 mobjbtran.qty,
                 mobjbtran.rate
           }, false);

期望上面的代码填充数据表。但没有产生任何行。调试上述代码时,'rows'变量显示在调试器中

无法计算表达式。不支持操作。未知错误:0x80070057'

所以我尝试了这个:

var rows = from mobjbmast in Context.bmasts.AsEnumerable()
           join mobjbtran in Context.btrans.AsEnumerable()
           on mobjbmast.billno equals mobjbtran.billno
           join mobjwaiter in Context.waiters.AsEnumerable()
           on mobjbmast.scode equals mobjwaiter.code
           where mobjbmast.billno == mbillno
           select new { billno = mobjbmast.billno, date = mobjbmast.date, time = mobjbmast.time, sname = mobjwaiter.name, name = mobjbtran.name, qty = mobjbtran.qty, rate = mobjbtran.rate };

场景没有变化。

用ToList()尝试上述方法

var rows = from mobjbmast in Context.bmasts.ToList()
           join mobjbtran in Context.btrans.ToList()
           on mobjbmast.billno equals mobjbtran.billno
           join mobjwaiter in Context.waiters.ToList()
           on mobjbmast.scode equals mobjwaiter.code
           where mobjbmast.billno == mbillno
           select new { billno = mobjbmast.billno, date = mobjbmast.date, time = mobjbmast.time, sname = mobjwaiter.name, name = mobjbtran.name, qty = mobjbtran.qty, rate = mobjbtran.rate };

这一次,错误消失了,但在调试器中,我看到“枚举未产生结果”消息。

还尝试添加DefaultIfEmpty()。

我知道我可以将此输出加载到List<T>。但是这里需要一个数据表,不需要一个类。

如何构造查询以返回正确的 IEnumerable 以转换为数据表?

【问题讨论】:

  • 您使用的是Entity,数据库和应用程序之间的表映射不匹配。您可能更新了数据库,然后没有更新映射。因此,您需要更新映射,然后确保重新编译整个项目。通常,编译器依赖项无法识别数据库更改,并且目标文件不会重新编译。
  • 感谢您的回复。情况并非如此。数据库和实体表是匹配的,我可以肯定地说,因为在这段代码上方有执行 Context.SaveChanges() 的表更新代码,然后是这段代码。因此,毫无疑问,数据库和实体之间的映射错误。
  • 然后我会复制项目bin文件夹并删除bin。然后重新编译强制所有对象模块重新编译。还要检查是否构建了 Debug 和 Release 可执行时间戳。您可能正在使用发行版,但仅构建调试。删除 bin 文件夹会显示这些类型错误。

标签: c# entity-framework linq


【解决方案1】:

根据一些网站的建议,我终于这样解决了

DataTable dttable = new DataTable();

dttable.Columns.Add("billno", typeof(String));
dttable.Columns.Add("date", typeof(DateTime));
dttable.Columns.Add("time", typeof(String));
dttable.Columns.Add("sname", typeof(String));
dttable.Columns.Add("name", typeof(String));
dttable.Columns.Add("qty", typeof(Decimal));
dttable.Columns.Add("rate", typeof(Decimal));

var rows = from mobjbmast in Context.bmasts.AsEnumerable()
           join mobjbtran in odlsContext.btrans
           on mobjbmast.billno equals mobjbtran.billno
           join mobjwaiter in Context.waiters
           on mobjbmast.scode equals mobjwaiter.code
           where mobjbmast.billno == mbillno
           let billarray = new object[]
           {
                mobjbmast.billno,
                mobjbmast.date,
                mobjbmast.time,
                mobjwaiter.name,
                mobjbtran.name,
                mobjbtran.qty,
                mobjbtran.rate
           }
           select billarray;
foreach (var array in rows)
{
    dttable.Rows.Add(array);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多