本文将带您了解关于EF实体查询出的数据List转DataTable出现【DataSet不支持System.Nullable<>】的问题的新内容,另外,我们还将为您提供关于.net–如何处理System
本文将带您了解关于EF实体查询出的数据List
- EF实体查询出的数据List
转DataTable出现【DataSet 不支持 System.Nullable<>】的问题 - .net – 如何处理System.Data.DataTableExtensions.CopyToDataTable()中的缺陷
- .net 手动建DataTable 获取DataTable列名 修改DataTable 列的顺序
- ArcEngine ITable 与System.DataTable相互转换
- ASP.NET操作DataTable各种方法总结(给Datatable添加行列、DataTable选择排序等)
EF实体查询出的数据List转DataTable出现【DataSet 不支持 System.Nullable<>】的问题
public static DataTable ToDataTable<T>(this IEnumerable<T> varlist, CreateRowDelegate<T> fn)
{
DataTable dtReturn = new DataTable();
// column names
PropertyInfo[] oProps = null;
// Could add a check to verify that there is an element 0
foreach (T rec in varlist)
{
// Use reflection to get property names, to create table, Only first time, others will follow
if (oProps == null)
{
oProps = ((Type)rec.GetType()).GetProperties();
foreach (PropertyInfo pi in oProps)
{
Type colType = pi.PropertyType; if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
{
colType = colType.GetGenericArguments()[0];
}
dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
}
}
DataRow dr = dtReturn.NewRow(); foreach (PropertyInfo pi in oProps)
{
dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue(rec, null);
}
dtReturn.Rows.Add(dr);
}
return (dtReturn);
}
public delegate object[] CreateRowDelegate<T>(T t);
List<T> list = DAL.ToList();
dataGridView1.DataSource = list.ToDataTable(a => new object[] { list });
以上代码可解决
.net – 如何处理System.Data.DataTableExtensions.CopyToDataTable()中的缺陷
导入(在VB.NET中)System.Data.DataTableExtensions然后针对IEnumerable调用该方法使用此方法.如果要使用LINQ过滤数据表,然后在最后还原DataTable,则可以执行此操作.
即:
Imports System.Data.DaTarowExtensions Imports System.Data.DataTableExtensions Public Class SomeClass Private Shared Function GetData() As DataTable Dim Data As DataTable Data = LegacyADO.NETDBCall Data = Data.AsEnumerable.Where(Function(dr) dr.Field(Of Integer)("SomeField") = 5).copyToDataTable() Return Data End Function End Class
在上面的示例中,“WHERE”过滤可能不会返回任何结果.如果发生这种情况,copyToDataTable会抛出异常,因为没有DaTarows.
为什么?
正确的行为应该是返回一个Rows.Count = 0的DataTable.
任何人都可以想到一个干净的解决方法,这样调用copyToDataTable的人不必知道这个问题吗?
System.Data.DataTableExtensions是一个静态类,所以我无法覆盖行为….任何想法?我错过了什么吗?
干杯
更新:
我已将此问题提交给Connect.我仍然想要一些建议,但如果您同意我的意见,可以通过以上链接在Connect上投票
干杯
someDataTable.AsEnumerable().Where(r => r.Field<string>("SomeField") == "SomeValue").AsDataView().ToTable();
.AsDataView().ToTable()返回一个空表,其结构与someDataTable相同,如果现在有从.Where()返回的行
.net 手动建DataTable 获取DataTable列名 修改DataTable 列的顺序
//创建 表
DataTable tables = new DataTable();
//添加 创建 列
//第一列
DataColumn cums = new DataColumn();
cums.ColumnName = "UserName";
cums.DataType = typeof(string);
tables.Columns.Add(cums);
cums = new DataColumn();
cums.ColumnName = "Age";
cums.DataType = typeof(string);
tables.Columns.Add(cums);
tables.Columns.Add("Address", typeof(string)); 这种用的较多
tables.Columns["Address"].SetOrdinal(0); //修改DataTable 列的顺序
string[] columnNames = GetColumnsByDataTable(tables);
string ss = columnNames[0];
/// <summary>
/// 根据datatable获得列名
/// </summary>
/// <param name="dt">表对象</param>
/// <returns>返回结果的数据列数组</returns>
public string[] GetColumnsByDataTable(DataTable dt)
{
string[] strColumns = null;
if (dt.Columns.Count > 0)
{
int columnNum = 0;
columnNum = dt.Columns.Count;
strColumns = new string[columnNum];
for (int i = 0; i < dt.Columns.Count; i++)
{
strColumns[i] = dt.Columns[i].ColumnName;
}
}
return strColumns;
}
ArcEngine ITable 与System.DataTable相互转换
/// <summary>
/// 打开dbf表
/// </summary>
/// <param name="pathName"></param>
/// <param name="tableName"></param>
/// <returns></returns>
public static ITable OpenTable(string pathName, string tableName)
{
// Create the workspace name object.
IWorkspaceName workspaceName = new WorkspaceNameClass();
workspaceName.PathName = pathName;
workspaceName.WorkspaceFactoryProgID = "esriDataSourcesFile.shapefileworkspacefactory";
// Create the table name object.
IDatasetName dataSetName = new TableNameClass();
dataSetName.Name = tableName;
dataSetName.WorkspaceName = workspaceName;
// Open the table.
IName name = (IName)dataSetName;
ITable table = (ITable)name.Open();
return table;
}
/// <summary>
/// 将ITable转换为DataTable
/// </summary>
/// <param name="mTable"></param>
/// <returns></returns>
public static DataTable ToDataTable(ITable mTable)
{
try
{
DataTable pTable = new DataTable();
for (int i = 0; i < mTable.Fields.FieldCount; i++)
pTable.Columns.Add(mTable.Fields.get_Field(i).Name);
ICursor pCursor = mTable.Search(null, false);
IRow pRrow = pCursor.NextRow();
while (pRrow != null)
{
DataRow pRow = pTable.NewRow();
string[] StrRow = new string[pRrow.Fields.FieldCount];
for (int i = 0; i < pRrow.Fields.FieldCount; i++)
StrRow[i] = pRrow.get_Value(i).ToString();
pRow.ItemArray = StrRow;
pTable.Rows.Add(pRow);
pRrow = pCursor.NextRow();
}
return pTable;
}
catch (Exception ex)
{
return null;
}
}
/// <summary>
/// 把DataTable转为ITable ,tempPath 不含文件名的问价夹路径
/// </summary>
/// <param name="mTable"></param>
/// <returns></returns>
public static ITable ToITable(DataTable mTable,string tempPath)
{
try
{
#region 新建表字段
IField pField = null;
IFields fields = new FieldsClass();
IFieldsEdit fieldsEdit = (IFieldsEdit)fields;
fieldsEdit.FieldCount_2 = 3;
pField = new FieldClass();
IFieldEdit fieldEdit = (IFieldEdit)pField;
fieldEdit.Name_2 = "FromField";
fieldEdit.AliasName_2 = "开始字段值";
fieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
fieldEdit.Editable_2 = true;
//添加开始字段
fieldsEdit.set_Field(0, pField);
IField pField1 = new FieldClass();
IFieldEdit fieldEdit1 = (IFieldEdit)pField1;
fieldEdit1.Name_2 = "ToField";
fieldEdit1.AliasName_2 = "结束字段值";
fieldEdit1.Type_2 = esriFieldType.esriFieldTypeDouble;
fieldEdit1.Editable_2 = true;
//添加结束字段
fieldsEdit.set_Field(1, pField1);
IField pField2 = new FieldClass();
IFieldEdit fieldEdit2 = (IFieldEdit)pField2;
fieldEdit2.Name_2 = "outField";
fieldEdit2.AliasName_2 = "分类字段值";
fieldEdit2.Type_2 = esriFieldType.esriFieldTypeDouble;
fieldEdit2.Editable_2 = true;
//添加重分类字段
fieldsEdit.set_Field(2, pField2);
#endregion
ShapefileWorkspaceFactoryClass class2 = new ShapefileWorkspaceFactoryClass();
ESRI.ArcGIS.Geodatabase.IWorkspace pWorkspace = class2.OpenFromFile(tempPath, 0);
IFeatureWorkspace pFWS = pWorkspace as IFeatureWorkspace;
//删除已有的
if (System.IO.File.Exists(tempPath + "重分类.dbf"))
System.IO.File.Delete(tempPath + "重分类.dbf");
//创建空表
ESRI.ArcGIS.Geodatabase.ITable pTable;
pTable = pFWS.CreateTable("重分类", fieldsEdit, null, null, "");
//获取表中记录数
int count=mTable .Rows .Count ;
//转换为ITable中的数据
for(int k=0;k<count ;k++)
{
//ITable 的记录
IRow row = pTable.CreateRow();
DataRow pRrow=mTable .Rows[k];
//列元素
int rowNum= pRrow .ItemArray.Length;
// 添加记录
for (int n=1;n<rowNum+1 ;n++)
{
row.set_Value(n,pRrow.ItemArray.GetValue(n-1));
row.Store ();
}
}
return pTable ;
}
catch (Exception ex)
{
return null;
}
}
/// <summary>
///保存DataTable表位DBF ,tempPath 文件完整路径
/// </summary>
/// <param name="mTable"></param>
/// <returns></returns>
public static bool SaveTable(DataTable mTable, string tempPath)
{
try
{
#region 新建表字段
IField pField = null;
IFields fields = new FieldsClass();
IFieldsEdit fieldsEdit = (IFieldsEdit)fields;
fieldsEdit.FieldCount_2 = 3;
pField = new FieldClass();
IFieldEdit fieldEdit = (IFieldEdit)pField;
fieldEdit.Name_2 = "FromField";
fieldEdit.AliasName_2 = "开始字段值";
fieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
fieldEdit.Editable_2 = true;
//添加开始字段
fieldsEdit.set_Field(0, pField);
IField pField1 = new FieldClass();
IFieldEdit fieldEdit1 = (IFieldEdit)pField1;
fieldEdit1.Name_2 = "ToField";
fieldEdit1.AliasName_2 = "结束字段值";
fieldEdit1.Type_2 = esriFieldType.esriFieldTypeDouble;
fieldEdit1.Editable_2 = true;
//添加结束字段
fieldsEdit.set_Field(1, pField1);
IField pField2 = new FieldClass();
IFieldEdit fieldEdit2 = (IFieldEdit)pField2;
fieldEdit2.Name_2 = "outField";
fieldEdit2.AliasName_2 = "分类字段值";
fieldEdit2.Type_2 = esriFieldType.esriFieldTypeDouble;
fieldEdit2.Editable_2 = true;
//添加重分类字段
fieldsEdit.set_Field(2, pField2);
#endregion
string path = System.IO.Path.GetDirectoryName(tempPath);
string fileName = System.IO.Path.GetFileName(tempPath);
ShapefileWorkspaceFactoryClass class2 = new ShapefileWorkspaceFactoryClass();
ESRI.ArcGIS.Geodatabase.IWorkspace pWorkspace = class2.OpenFromFile(path, 0);
IFeatureWorkspace pFWS = pWorkspace as IFeatureWorkspace;
//删除已有的
if (System.IO.File.Exists(tempPath))
System.IO.File.Delete(tempPath);
fileName = fileName.Split(''.'')[0];
//创建空表
ESRI.ArcGIS.Geodatabase.ITable pTable;
pTable = pFWS.CreateTable(fileName, fieldsEdit, null, null, "");
//获取表中记录数
int count = mTable.Rows.Count;
//转换为ITable中的数据
for (int k = 0; k < count; k++)
{
//ITable 的记录
IRow row = pTable.CreateRow();
DataRow pRrow = mTable.Rows[k];
//列元素
int rowNum = pRrow.ItemArray.Length;
// 添加记录
for (int n = 1; n < rowNum + 1; n++)
{
row.set_Value(n, pRrow.ItemArray.GetValue(n - 1));
row.Store();
}
}
return true ;
}
catch (Exception ex)
{
return false ;
}
}
ASP.NET操作DataTable各种方法总结(给Datatable添加行列、DataTable选择排序等)
本文转自:https://www.cnblogs.com/sntetwt/p/3496477.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
namespace Gzcms.Common
{
public
class
CreateTable
{
public
static
DataTable getTable()
{
//1.创建 datatable
DataTable dt =
new
DataTable(
"datatable"
);
//可以给表创建一个名字,datatable
//2.给表加个列名:
dt.Columns.Add(
"id"
,
typeof
(System.Int32));
//类型是可以变换的,比如System.Int32,System.Double..
dt.Columns.Add(
"title"
,
typeof
(System.String));
//3.给表加行,内容:
DataRow row = dt.NewRow();
row[
"id"
] = 1;
row[
"title"
] =
"标题1"
;
dt.Rows.Add(row);
//这样就可以添加了
row = dt.NewRow();
row[
"id"
] = 2;
row[
"title"
] =
"标题2"
;
dt.Rows.Add(row);
return
dt;
/*
//4. 过滤表内容,,查找id为1的信息
DataRow[] arr = dt.Select("id=1");//返回的是一个数组
//5.将过滤的内容插入到另一个table中
DataTable dtnew = dt.Clone();//将表dt里的列信息复制到dtnew里,不是复制数据
foreach (DataRow row in arr)
{
dtnew.Rows.Add(row);//把过滤好的信息加入到dtnew里
}
dt.AcceptChanges();//添加好后,要记得刷新一下!
//6.给表排序
dt.DefaultView.Sort = "id desc";
//7.删除数据
dt.Rows.Remove(row);//根据row行信息删除
dt.Rows.RemoveAt(index);//根据index索引删除
//8.修改dt 的列信息
row2[0].BeginEdit();
row2[0]["status"] = 0;
row2[0].EndEdit();
*/
}
}
}
|
我们今天的关于EF实体查询出的数据List
本文标签: