项目中遇到一个问题,利用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. Java Swing 如何让窗体居中显示

    如题,其他不多说,直接上代码! package com.himarking.tool; import java.awt.Toolkit; import javax.swing.JFrame; @Sup ...

  2. day69-oracle 22-DBCA

    只涉及到数据库的管理,不涉及到数据库的开发.不涉及到写SQL程序或者是写增删改查,不涉及到这些东西,也不涉及到事务. 你在安装oracle的时候它自动帮你创建一个数据库.

  3. 【总结整理】openlayer

    实时路况 http://www.cnblogs.com/gisvip/archive/2012/11/24/2787141.html

  4. koa2 原生链接mysql

    1.安装mysql $ npm install mysql 2.代码示例: const mysql = require("mysql"); // mysql.Promise = g ...

  5. ruby 数组与散列

    def say_goodnight(name) result ="Good night ." +name return result end def say_goodmorning ...

  6. ROS Learning-018 Arduino-For-ROS-003 (总结篇) 模板程序 即 如何运行

    Arduino For ROS-003 - (总结篇) 模板程序 即 如何运行 我的Ubuntu系统:Ubuntu 14.04.10 TLS 32位 Arduino的版本:Arduino 1.6.11 ...

  7. debug配置

  8. java后台对json格式数据的解析

    Json 和 Jsonlib 的使用 什么是 Json JSON(JvaScript Object Notation)(官网网站:http://www.json.org/)是 一种轻量级的数据交换格式 ...

  9. FileInfo类和DirectoryInfo类

    FileInfo类和DirectoryInfo类可以方便地对文件和文件夹进行操作. 1. FileInfo类(非静态类) FileInfo类和File类之间许多方法调用都是相同的,但是FileInfo ...

  10. .net core webapi +ddd(领域驱动)+nlog配置+swagger配置 学习笔记(1)

    搭建一个.net core webapi项目  在开始之前,请先安装最新版本的VS2017,以及最新的.net core 2.1. 首先创建一个Asp.Net Core Web应用程序 这个应用程序是 ...