项目中遇到一个问题,利用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不属于表的更多相关文章

  1. 步步学LINQ to SQL:将类映射到数据库表【转】

    [IT168 专稿]该系列教程描述了如何采用手动的方式映射你的对象类到数据表(而不是使用象SqlMetal这样的自动化工具)以便能够支持数据表之间的M:M关系和使用实体类的数据绑定.即使你选择使用了自 ...

  2. 【NHibernate】列“ReservedWord”不属于表 ReservedWords

    NHibernate+FluentNHibernate+MySql 运行时黄页显示下边的异常,项目中找了半天没出现过这个列的关键字. [ArgumentException: 列“ReservedWor ...

  3. 列"xx"不在表Table中

    在数据库中用了left join来查一个表的所有列和另一个表的一个列,但无论用IDataReader还是DataSet都不能获取到另一个表的列,调试时总是说没有那个值,但在数据库中执行语句又有.一直想 ...

  4. SQLServer中查询表结构(表主键 、列说明、列数据类型、所有表名)的Sql语句

    SQLServer中查询表结构(表主键 .列说明.列数据类型.所有表名)的Sql语句 1.查询数据库中的所有表名称: SELECT name FROM SysObjects Where XType=' ...

  5. LINQ按多列分组(Group By)并计算总和(Sum) (转载)

    来源:https://codedefault.com/2018/group-by-multiple-columns-and-sum-in-csharp .NET[C#]LINQ按多列分组(Group ...

  6. Greenplum 行存、列存,堆表、AO表的原理和选择

    转载自: https://github.com/digoal/blog/blob/master/201708/20170818_02.md?spm=a2c4e.11153940.blogcont179 ...

  7. 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/ ...

  8. linq行转列

    using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Text; ...

  9. JSF dataTable 添加列 动态创建数据表 列

    @Named @ViewScoped public class LiveRangeService implements Serializable { private List< Map<S ...

随机推荐

  1. C语言学习笔记--内存分区

    1. 程序中的栈 1.1 栈的简介 (1)栈中现代计算机程序里最为重要的概念之一 (2)栈在程序中用于维护函数调用上下文 (3)函数中的参数和局部变量存储在栈上 (4)栈保存了一个函数调用所需的维护信 ...

  2. C语言学习笔记--指针和数组的关系

    1.数组的本质 (1)数组是一段连续的内存空间 (2)数组的空间大小:sizeof(array_type)*array_size; (3)数组名可看做指向数组第一个元素的常量指针 (4)数组声明时编译 ...

  3. oracle时间段查询-从00:00:00开始

    之所以记录一下这篇博文,是因为前段时间搞的一个查询发现要从00:00:00这个时间段开始,必须要通过拼接字符串. <select id="queryApplyProgressList& ...

  4. js在浏览器下的区别小结(部分)

    1.初始化数组: document.write([1,2,3,].length); IE:4//把数组中最后一个逗号后面的当做了undefined元素 FF.Opera.Safari:3 2.join ...

  5. python dict.fromkeys()研究

    def unique(seq): #return [x for x in my_list if x not in locals()['_[1]']] return {}.fromkeys(seq).k ...

  6. a标签中href=""的几种用法(转)

    a标签中href=""的几种用法   标签: html / a标签 / javascript 46371 众所周知,a标签的最重要功能是实现超链接和锚点.而且,大多数人认为a标签最 ...

  7. Codeforces 58E Expression (搜索)

    题意:给你一个可能不正确的算式a + b = c, 你可以在a,b,c中随意添加数字.输出一个添加数字最少的新等式x + y  = z; 题目链接 思路:来源于这片博客:https://www.cnb ...

  8. [转载]HTTP无状态是什么意思?

    作者:曾著链接:https://www.zhihu.com/question/265610863/answer/300533939来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  9. Django框架 之 admin管理工具(源码解析)

    浏览目录 单例模式 admin执行流程 admin源码解析 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在 ...

  10. redhat图形界面启动后出现桌面但是没有登录界面解决办法

    redhat图形界面启动后出现桌面但是没有登录界面解决办法 2014年07月11日 10:50:10 阅读数:7931 redhat Linux一直用着好好地,今天打开只有图像界面背景,没有出现登陆界 ...