项目中遇到一个问题,利用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. 关于TortoiseGit设置代理服务器会自动取消的问题解决方法

    在前些日子,我使用TortoiseGit的并给其设置代理服务器的时候,每次设置好之后,关闭打开总是会自动取消勾选,通过不断的尝试和分析之后,得出了解决方案. 首先,这个配置项是保存在HOME环境变量对 ...

  2. 提示crontab command not found的解决方法

    操作步骤   1. 确认crontab是否安装:   执行 crontab 命令如果报 command not found,就表明没有安装   2. 安装 crontab   执行 yum insta ...

  3. PHP trim() 函数

    定义和用法 trim() 函数从字符串的两端删除空白字符和其他预定义字符. 语法 trim(string,charlist) 参数 描述 string 必需.规定要检查的字符串. charlist 可 ...

  4. java的编码问题详解

    ucenter的中文问题终于解决,这也暴露我对Java编码知识的严重不足,经过多次试验和搜索,对这块知识终于有了一个新的认识,所以把理解的内容写道这里 1:JVM的内存中字符串的编码格式是统一的吗? ...

  5. SPOJ - AMR11H Array Diversity (水题排列组合或容斥)

    题意:给定一个序列,让你求两种数,一个是求一个子序列,包含最大值和最小值,再就是求一个子集包含最大值和最小值. 析:求子序列,从前往记录一下最大值和最小值的位置,然后从前往后扫一遍,每个位置求一下数目 ...

  6. Winform定时启动

    System.Timers.Timer t; ; int qian; int bai; int shi; int ge; public 测试定时启动() { InitializeComponent() ...

  7. WinForm 生命周期, WinForm 事件执行顺序

    1.窗体启动: Control.HandleCreatedControl.BindingContextChangedForm.LoadControl.VisibleChangedForm.Activa ...

  8. Javascript-DOM笔记

    参考 javascript原生dom操作方法 JavaScript原生的dom操作方法 第一类:节点查找相关方法和属性 document/父节点.getElementById()document/父节 ...

  9. JavaScript混淆压缩

    比较好用的压缩软件,支持合并 JsCompressor-v3.0 比较好用的混淆站点:http://dean.edwards.name/packer/

  10. 使用cydia substrate 来进行android native hook

      cydia不仅可以hook java代码,同样可以hook native代码,下面举一个例子来进行android native hook 我是在网上找到的supermathhook这个项目,在他基 ...