用check c#合并两个数据表
本文关键字:两个 数据表 check 合并 | 更新日期: 2023-09-27 18:16:48
我有两个数据表如下,
dtOrigin
RowId Stk ProdName
2 245 ABC
4 144 XYZ
5 122 ADE
dt1
RowId Stk
2 2
4 7
我需要合并这两个数据表来产生下面的结果,基本上如果rowid存在于dt1中,需要从dtOrigin中减去其库存数量dtNew
RowId Stk ProdName
2 243(245-2) ABC
4 137(144-7) XYZ
5 122 ADE
我可以用循环来做这个,但是有没有办法不用循环来做呢由于
var JoinResult = (from p in dt1.AsEnumerable()
join t in dt2.AsEnumerable()
on p.Field<string>("RowID") equals t.Field<string>("RowID")
into joinedtables from stuff in joinedtables.DefaultIfEmpty()
select new
{
----------------,
----------------,
Stock = p.Field<Int32>("Stk") - stuff.Field<Int32>("Stk")
}
抛出异常。你能更正一下吗?
下面是使用 的代码
var JoinResult = (from p in dt.AsEnumerable()
join t in dt2.AsEnumerable()
on p.Field<string>("RowID") equals t.Field<string>("RowID")
into joinedtables from stuff in joinedtables.DefaultIfEmpty()
select new
{
RowID = p.Field<string>("RowID"),
ProdName = p.Field<string>("ProdName"),
STK = p.Field<Int32>("STK") - stuff?.Field<Int32>("STK") ?? 0
}
dtable = LINQResultToDataTable(JoinResult);
public static DataTable LINQResultToDataTable<T>(IEnumerable<T> Linqlist)
{
DataTable dt = new DataTable();
PropertyInfo[] columns = null;
if (Linqlist == null) return dt;
foreach (T Record in Linqlist)
{
if (columns == null)
{
columns = ((Type)Record.GetType()).GetProperties();
foreach (PropertyInfo GetProperty in columns)
{
Type IcolType = GetProperty.PropertyType;
if ((IcolType.IsGenericType) && (IcolType.GetGenericTypeDefinition()
== typeof(Nullable<>)))
{
IcolType = IcolType.GetGenericArguments()[0];
}
dt.Columns.Add(new DataColumn(GetProperty.Name, IcolType));
}
}
DataRow dr = dt.NewRow();
foreach (PropertyInfo p in columns)
{
dr[p.Name] = p.GetValue(Record, null) == null ? DBNull.Value : p.GetValue
(Record, null);
}
dt.Rows.Add(dr);
}
return dt;
}
试试这个:
var JoinResult =
...
select new {
...
Stock = p.Field<Int32>("Stk") - (stuff?.Field<Int32>("Stk") ?? 0)
};
我猜,当第二个数据表中没有匹配的记录时,stuff
将是null
,在试图读取该行的值时导致NullReferenceException
。这个表达式:
stuff?.Field<Int32>("Stk")
表示"如果stuff
为null
,则整个表达式的求值应为null
,否则返回字段的值"。
这还不够;因为你不能用别的东西减去null
。它需要传递给??
操作符:
stuff?.Field<Int32>("Stk") ?? 0
这意味着如果左侧不是null
,则使用该值,否则使用0。