【发布时间】: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