Pie*_*ers 5 .net c# datatable data-access
我有许多包含这样的表的静态类:
using System;
using System.Data;
using System.Globalization;
public static class TableFoo
{
private static readonly DataTable ItemTable;
static TableFoo()
{
ItemTable = new DataTable("TableFoo") { Locale = CultureInfo.InvariantCulture };
ItemTable.Columns.Add("Id", typeof(int));
ItemTable.Columns["Id"].Unique = true;
ItemTable.Columns.Add("Description", typeof(string));
ItemTable.Columns.Add("Data1", typeof(int));
ItemTable.Columns.Add("Data2", typeof(double));
ItemTable.Rows.Add(0, "Item 1", 1, 1.0);
ItemTable.Rows.Add(1, "Item 2", 1, 1.0);
ItemTable.Rows.Add(2, "Item 3", 2, 0.75);
ItemTable.Rows.Add(3, "Item 4", 4, 0.25);
ItemTable.Rows.Add(4, "Item 5", 1, 1.0);
}
public static DataTable GetItemTable()
{
return ItemTable;
}
public static int Data1(int id)
{
DataRow[] dr = ItemTable.Select("Id = " + id);
if (dr.Length == 0)
{
throw new ArgumentOutOfRangeException("id", "Out of range.");
}
return (int)dr[0]["Data1"];
}
public static double Data2(int id)
{
DataRow[] dr = ItemTable.Select("Id = " + id);
if (dr.Length == 0)
{
throw new ArgumentOutOfRangeException("id", "Out of range.");
}
return (double)dr[0]["Data2"];
}
}
Run Code Online (Sandbox Code Playgroud)
是否有更好的方法来编写 Data1 或 Data2 方法,这些方法从与给定 id 匹配的单行返回单个值?
更新 #1:
我创建了一个看起来很不错的扩展方法:
public static T FirstValue<T>(this DataTable datatable, int id, string fieldName)
{
try
{
return datatable.Rows.OfType<DataRow>().Where(row => (int)row["Id"] == id).Select(row => (T)row[fieldName]).First();
}
catch
{
throw new ArgumentOutOfRangeException("id", "Out of range.");
}
}
Run Code Online (Sandbox Code Playgroud)
然后我的 Data1 方法变为:
public static int Data1(int id)
{
return ItemTable.FirstValue<int>(id, "Data1");
}
Run Code Online (Sandbox Code Playgroud)
和 Data2 变成:
public static double Data2(int id)
{
return ItemTable.FirstValue<double>(id, "Data2");
}
Run Code Online (Sandbox Code Playgroud)
感谢您的所有回复,尤其感谢 Anthony Pegram,他提供了非常好的一行 LINQ 和 Lambda 代码。
你考虑过使用Linq (to DataSets)吗?使用 Linq 表达式,您根本不需要那些 Data1 和 Data2 函数,因为查找和过滤可以在一行代码中进行。
添加的示例:
从这里开始拍摄,所以请带上一粒盐(不要靠近 IDE :)
DataTable itemTbl = GetItemTable().AsEnumerable();
double dt1 = ((From t In itemTbl Where t.Id = <your_id> Select t).First())["Data1"];
Run Code Online (Sandbox Code Playgroud)
这是两行代码,但您可以轻松包装 Enumerable 的获取。
| 归档时间: |
|
| 查看次数: |
26184 次 |
| 最近记录: |