用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;
        }

用check c#合并两个数据表

试试这个:

var JoinResult = 
                 ...
                 select new {
                     ...
                     Stock = p.Field<Int32>("Stk") - (stuff?.Field<Int32>("Stk") ?? 0)
                 };

我猜,当第二个数据表中没有匹配的记录时,stuff将是null,在试图读取该行的值时导致NullReferenceException。这个表达式:

stuff?.Field<Int32>("Stk")

表示"如果stuffnull,则整个表达式的求值应为null,否则返回字段的值"。

这还不够;因为你不能用别的东西减去null。它需要传递给??操作符:

stuff?.Field<Int32>("Stk") ?? 0

这意味着如果左侧不是null,则使用该值,否则使用0。