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 ...
随机推荐
- javascript的概述
JavaScript是怎么诞生的???刚开始的是为了验证表单而开发出来的. 什么是JavaScript???a.面向对象的编程语言b.解释性的编程语言(说白了就是不用编译的一种语言)c.脚本语言(说白 ...
- JavaPersistenceWithHibernate第二版笔记-第七章-004Mapping a map(@MapKeyEnumerated 、 @MapKeyTemporal、@MapKeyColumn)
一.结构 二.代码 1. package org.jpwh.model.collections.mapofstrings; import org.jpwh.model.Constants; impor ...
- CF702E Analysis of Pathes in Functional Graph
倍增练习题. 基环树上倍增一下维护维护最小值和权值和,注意循环的时候$j$这维作为状态要放在外层循环,平时在树上做的时候一个一个结点处理并不会错,因为之前访问的结点已经全部处理过了. 时间复杂度$O( ...
- python3-字典的增删改查
# Auther: Aaron Fan info = { "stull01":"alen zhang", "stull02":"s ...
- C和C++中文件读写的区别
C中采用的主要是文件指针的办法,C++中对文件的操作主要运用了“文件流”(即非标准的输入输出)的思想 eg1": #include<stdio.h> //... FILE* fp ...
- [转载]应用 Valgrind 发现 Linux 程序的内存问题
应用 Valgrind 发现 Linux 程序的内存问题 如何定位应用程序开发中的内存问题,一直是 inux 应用程序开发中的瓶颈所在.有一款非常优秀的 linux 下开源的内存问题检测工具:valg ...
- STL 结构体 内部函数
typedef struct Node { int val; string name; bool operator < (const Node &right) const { retur ...
- for循环 break
for (int i = 1; i <= 8;i++) {} for (int i=10; i>=1;i--) i的起始值是10 着次递减 for(){}嵌套放便控制行列的长短 break ...
- 动态绑数据(Repeater控件HeaderTemplate和ItemTemplate)
前几天,Insus.NET有写了<动态绑数据(GridView控件Header和ItemTemplate)>http://www.cnblogs.com/insus/p/3303192.h ...
- ffmpeg windows下编译ffmpeg
windows下编译ffmpeg 今天由于工作需求需重新编译ffmpeg,百度,goole了一大堆,看眼花缭乱的,但几乎都是三种方案,大部分都是直接转发,一字不漏,错误的缺文件的还是照转,可是问题都大 ...