Linq To DataTalbe 列X不属于表
项目中遇到一个问题,利用linq to datatable查询得到一个query,截止到红色代码部分时,一切都正常,只要一运行query.where 就会报异常:列“SingDate”不属于列表,查看了半天都不知道是为什么,下面是原来的代码:
var query = from r in deptName.AsEnumerable()
select new
{
BizDept = r.Field<string>("DEP_NAME"),
BizDeptNO = r.Field<string>("DEP_NO"),
TotalNum = (from item in dt.AsEnumerable()
where item.Field<string>("BizDeptNO") == r.Field<string>("DEP_NO")
select item).ToList().Count(),
TotalNumEnd = (from item in dt.AsEnumerable()
where item.Field<string>("BizDeptNO") == r.Field<string>("DEP_NO")
&& item.Field<DateTime>("SingDate").ToString("yyyy-MM") == temEnd
select item).ToList().Count(),
TotalMainAmount = (from item in dt.AsEnumerable()
where item.Field<string>("BizDeptNO") == r.Field<string>("DEP_NO")
&& item.Field<string>("MainID") == null
select new { tm = item.Field<decimal>("Amount") }).Sum(p => p.tm) * Convert.ToDecimal(0.00001),
TotalMainAmountEnd = (from item in dt.AsEnumerable()
where item.Field<string>("BizDeptNO") == r.Field<string>("DEP_NO")
&& item.Field<string>("MainID") == null && item.Field<DateTime>("SingDate").ToString("yyyy-MM") == temEnd
select new { tm = item.Field<decimal>("Amount") }).Sum(p => p.tm) * Convert.ToDecimal(0.00001),
TotalSubAmount = (from item in dt.AsEnumerable()
where item.Field<string>("BizDeptNO") == r.Field<string>("DEP_NO")
&& item.Field<string>("MainID") != null
select new { tm = item.Field<decimal>("Amount") }).Sum(p => p.tm) * Convert.ToDecimal(0.00001),
TotalSubAmountEnd = (from item in dt.AsEnumerable()
where item.Field<string>("BizDeptNO") == r.Field<string>("DEP_NO")
&& item.Field<string>("MainID") != null && item.Field<DateTime>("SingDate").ToString("yyyy-MM") == temEnd
select new { tm = item.Field<decimal>("Amount") }).Sum(p => p.tm) * Convert.ToDecimal(0.00001),
TotalAmount = (from item in dt.AsEnumerable()
where item.Field<string>("BizDeptNO") == r.Field<string>("DEP_NO")
select new { tm = item.Field<decimal>("Amount") }).Sum(p => p.tm) * Convert.ToDecimal(0.00001),
TotalAmountEnd = (from item in dt.AsEnumerable()
where item.Field<string>("BizDeptNO") == r.Field<string>("DEP_NO")
&& item.Field<DateTime>("SingDate").ToString("yyyy-MM") == temEnd
select new { tm = item.Field<decimal>("Amount") }).Sum(p => p.tm) * Convert.ToDecimal(0.00001)
};
var tem = query.ToList();
dt = DataTableHelper.ToDataTable(tem);
if (string.IsNullOrWhiteSpace(dept))
{
DataRow dr = dt.NewRow();
dr["BizDept"] = "合计";
dr["BizDeptNO"] = "";
dr["TotalNum"] = query.Where(p => p.BizDeptNO != "").Sum(p => p.TotalNum);
dr["TotalNumEnd"] = query.Where(p => p.BizDeptNO != "").Sum(p => p.TotalNumEnd);
dr["TotalMainAmount"] = query.Where(p => p.BizDeptNO != "").Sum(p => p.TotalMainAmount);
dr["TotalMainAmountEnd"] = query.Where(p => p.BizDeptNO != "").Sum(p => p.TotalMainAmountEnd);
dr["TotalSubAmount"] = query.Where(p => p.BizDeptNO != "").Sum(p => p.TotalSubAmount);
dr["TotalSubAmountEnd"] = query.Where(p => p.BizDeptNO != "").Sum(p => p.TotalSubAmountEnd);
dr["TotalAmount"] = query.Where(p => p.BizDeptNO != "").Sum(p => p.TotalAmount);
dr["TotalAmountEnd"] = query.Where(p => p.BizDeptNO != "").Sum(p => p.TotalAmountEnd);
dt.Rows.InsertAt(dr, dt.Rows.Count - );
}
最终,用query.ToList()代替类query,再进行计算,这个错误才消失,即:query.ToList().Where(……)!也就是像下面这样修改代码
var tem = query.ToList();
dt = DataTableHelper.ToDataTable(tem);
if (string.IsNullOrWhiteSpace(dept))
{
DataRow dr = dt.NewRow();
dr["BizDept"] = "合计";
dr["BizDeptNO"] = "";
dr["TotalNum"] = tem.Where(p => p.BizDeptNO != "").Sum(p => p.TotalNum);
dr["TotalNumEnd"] = tem.Where(p => p.BizDeptNO != "").Sum(p => p.TotalNumEnd);
dr["TotalMainAmount"] = tem.Where(p => p.BizDeptNO != "").Sum(p => p.TotalMainAmount);
dr["TotalMainAmountEnd"] = tem.Where(p => p.BizDeptNO != "").Sum(p => p.TotalMainAmountEnd);
dr["TotalSubAmount"] = tem.Where(p => p.BizDeptNO != "").Sum(p => p.TotalSubAmount);
dr["TotalSubAmountEnd"] = tem.Where(p => p.BizDeptNO != "").Sum(p => p.TotalSubAmountEnd);
dr["TotalAmount"] = tem.Where(p => p.BizDeptNO != "").Sum(p => p.TotalAmount);
dr["TotalAmountEnd"] = tem.Where(p => p.BizDeptNO != "").Sum(p => p.TotalAmountEnd);
dt.Rows.InsertAt(dr, dt.Rows.Count - );
}
难道说,直接再次调用query.Where,之前的查询(var query=……),还会默认执行一次么?
为了验证,我把SingDate字段设置成常量,再次运行,果然又报异常了,这次是其他的列不属于表,还真是,再次调用query.where, 原来的查询还会默认执行一遍!但问题又来了,就算再执行一遍,我的数据源不应该一直有数据么,怎么会找不到列了呢?难道数据源也改变了?这个问题,暂时记下,有时间继续研究研究。
如果哪位大哥知道原因,一定告诉小弟,先谢谢了!
Linq To DataTalbe 列X不属于表的更多相关文章
- 步步学LINQ to SQL:将类映射到数据库表【转】
[IT168 专稿]该系列教程描述了如何采用手动的方式映射你的对象类到数据表(而不是使用象SqlMetal这样的自动化工具)以便能够支持数据表之间的M:M关系和使用实体类的数据绑定.即使你选择使用了自 ...
- 【NHibernate】列“ReservedWord”不属于表 ReservedWords
NHibernate+FluentNHibernate+MySql 运行时黄页显示下边的异常,项目中找了半天没出现过这个列的关键字. [ArgumentException: 列“ReservedWor ...
- 列"xx"不在表Table中
在数据库中用了left join来查一个表的所有列和另一个表的一个列,但无论用IDataReader还是DataSet都不能获取到另一个表的列,调试时总是说没有那个值,但在数据库中执行语句又有.一直想 ...
- SQLServer中查询表结构(表主键 、列说明、列数据类型、所有表名)的Sql语句
SQLServer中查询表结构(表主键 .列说明.列数据类型.所有表名)的Sql语句 1.查询数据库中的所有表名称: SELECT name FROM SysObjects Where XType=' ...
- LINQ按多列分组(Group By)并计算总和(Sum) (转载)
来源:https://codedefault.com/2018/group-by-multiple-columns-and-sum-in-csharp .NET[C#]LINQ按多列分组(Group ...
- Greenplum 行存、列存,堆表、AO表的原理和选择
转载自: https://github.com/digoal/blog/blob/master/201708/20170818_02.md?spm=a2c4e.11153940.blogcont179 ...
- C#7.2——编写安全高效的C#代码 c# 中模拟一个模式匹配及匹配值抽取 走进 LINQ 的世界 移除Excel工作表密码保护小工具含C#源代码 腾讯QQ会员中心g_tk32算法【C#版】
C#7.2——编写安全高效的C#代码 2018-11-07 18:59 by 沉睡的木木夕, 123 阅读, 0 评论, 收藏, 编辑 原文地址:https://docs.microsoft.com/ ...
- linq行转列
using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Text; ...
- JSF dataTable 添加列 动态创建数据表 列
@Named @ViewScoped public class LiveRangeService implements Serializable { private List< Map<S ...
随机推荐
- ssh整合思想
整合过程:
- oracle --(四)表空间(tablespace)
基本关系:数据库---表空间---数据段---分区---数据块 表空间(tablespace)表空间(tablespace)是包含物理数据文件的逻辑实体,存放数据库的所有可用数据,因此表空间的尺寸也是 ...
- GSON 报错HibernateProxy. Forgot to register a type adapter? 的解决办法
使用Gson转换hibernate对象遇到一个问题,当对象的Lazy加载的,就会出现上面的错误.处理方式摘抄自网上,留存一份以后自己看. 网上找到的解决办法,首先自定义一个类继承TypeAdapter ...
- String/StringBuilder 类 判断QQ号码
1.1. 训练描述:[方法.String类] 一.需求说明:请用户输入一个“QQ号码”,我们来判断这个QQ号码是否正确. 要求:使用方法来完成判断功能. 1.2. 操作步骤描述 建立MainApp类 ...
- CPU时钟是个什么东西
CPU时钟说的是频率生成器,可能生成的是方波也可能是其它波. 频率生成器那是什么东西?这教要讲到压电效应了. 压电效应这个词是一个统称,它包括正压电效应和逆压电效应. 传说在很久以前有一个科学家发现了 ...
- p3295 [SCOI2016]萌萌哒
传送门 分析 我们可以将一个点拆成logN个点,分别代表从点i开始,长度为2^k的子串 那么当我们处理两个区间相等的关系时,对区间做二进制拆分,拆成log个区间,分别并起来即可 当然我们这样做修改是省 ...
- 前端基础 之JS
浏览目录 JavaScript语法基础 JavaScript数据类型及类型查询 JavaScript运算符 JavaScript流程控制 JavaScript函数 词法分析 JavaScript内置对 ...
- 自己实现 String 类
实现Stirng类:构造函数.复制构造.拷贝构造.重载<<符号(友元) #include <iostream> #include <string.h> #inclu ...
- 树莓派研究笔记(3)-- 安装VNC
小屏幕太小了,眼睛快看瞎了,必须安装VNC 才行啊. 更新—2018-02-04 最新版本的系统中自带了VNC了,只需要在 菜单 Preferences -> Raspberry Pi Conf ...
- RGB565的转换
RGB色彩模式也就是“红绿蓝”模式是一种颜色标准,是通过对红(R).绿(G).蓝(B)三种颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道的颜色,这个标准几 ...