2016-11-07 2 views
1

ich zwei Datentabellen wie unten habe,Zusammenführen von zwei Datentabellen mit Check C#

dtOrigin 
RowId Stk ProdName 
2  245 ABC 
4  144 XYZ 
5  122 ADE 


dt1 
RowId Stk 
2  2 
4  7 

Ich brauche diese zwei Datentabellen zu fusionieren unten Ergebnis zu erzielen, im Grunde, wenn Rowid in DT1 vorhanden ist, müssen seinen Lagerbestand auf minus von dtOrigin dtNew

RowId Stk   ProdName 
2  243(245-2) ABC 
4  137(144-7) XYZ 
5  122   ADE 

ich bin in der Lage diese mit Schleife zu tun, aber ist es trotzdem diese Dank ohne Schleife zu tun

    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") 
} 

Wurf Ausnahme. Kannst du bitte korrigieren?


Unten finden Sie den Code ich dies mit

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; 
     } 
+1

verwenden Wenn Sie Linq verwenden, um SQL dann können Sie verwenden linq Join Ausdruck –

+0

Welche Ausnahme wirft es? 'NullReferenceException'? 'InvalidArgumentException'? 'BetweenKeyboardAndChairException'? Es ist fast unmöglich für jemanden zu helfen, wenn Sie nicht genug Details zur Verfügung stellen. –

+0

@ZevSpitz, die Ausnahme ist {"Wert kann nicht Null sein. \ R \ nParametername: row"} –

Antwort

1

Versuchen:

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

dass ich nehme an, wenn kein passender Datensatz in der zweiten Datentabelle ist, wird stuff sein null, verursacht eine NullReferenceException beim Versuch, den Wert für diese Zeile zu lesen. Dieser Ausdruck:

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

bedeutet „wenn stuffnull ist, dann wird der gesamte Ausdruck zu null bewerten soll, sonst sollte es den Wert aus dem Feld zurück.“

Das ist immer noch nicht enoguh; weil Sie null von etwas anderem nicht subtrahieren können. Es muss an den ?? Betreiber übergeben werden:

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

was bedeutet, dass, wenn die linke Seite ist nicht null dann diesen Wert verwenden, sonst 0.

+0

Es funktioniert teilweise. Ich meine, wenn die RowId in beiden Tabellen vorhanden ist, zieht sie das Stk ab und wird korrekt angezeigt, aber die Produkte, die nicht in der zweiten Tabelle sind, aber in der ersten Tabelle vorhanden sind, zeigen immer STK = 0 an, auch wenn die erste Tabelle einen Wert für STK –

+0

hat der gesamte Ausdruck, den Sie für 'Stock = ???' verwenden? –

+0

aktualisiert die Frage mit dem gesamten Ausdruck –

Verwandte Themen