Left Outer Join – LINQ to Datatable

Sto cercando di applicare un left outer join utilizzando LINQ su due tabelle di dati. Sto ricevendo le eccezioni indicate di seguito quando si tenta di eseguire il debug e visualizzare i dati contenuti nella variabile di risultato:

Sistema.ArgumentException: Valore non può essere null. Nome del parametro: riga

Codice:

private DataTable DataTable1()
{
    DataRow dataRow = null;
    DataTable dt1 = new DataTable();
    dt1.Columns.Add("EmpId");
    dt1.Columns.Add("EmpName");
    dataRow = dt1.NewRow();
    dataRow["EmpId"] = "EMP001";
    dataRow["EmpName"] = "Ajaj Kumar";
    dt1.Rows.Add(dataRow);
    dataRow = dt1.NewRow();
    dataRow["EmpId"] = "EMP002";
    dataRow["EmpName"] = "Sanjay Gupta";
    dt1.Rows.Add(dataRow);
    dataRow = dt1.NewRow();
    dataRow["EmpId"] = "EMP003";
    dataRow["EmpName"] = "Ashish Charan";
    dt1.Rows.Add(dataRow);
    dt1.AcceptChanges();
    return dt1;
}

private DataTable DataTable2()
{
    DataRow dr = null;
    DataTable dt2 = new DataTable();
    dt2.Columns.Add("EmpId");
    dt2.Columns.Add("Salary");
    dr = dt2.NewRow();
    dr["EmpId"] = "EMP001";
    dr["Salary"] = "50000";
    dt2.Rows.Add(dr);
    dr = dt2.NewRow();
    dr["EmpId"] = "EMP002";
    dr["Salary"] = "45000";
    dt2.Rows.Add(dr);
    dt2.AcceptChanges();
    return dt2;
}

private void Form1_Load(object sender, EventArgs e)
{
    var empInfo = DataTable1().AsEnumerable();
    var empSal = DataTable2().AsEnumerable();

    var result = from dtEmpRow in empInfo
            join dtEmpSal in empSal
            on dtEmpRow.Field<string>("EmpId") equals dtEmpSal.Field<string>("EmpId")
            into outer
            from dtEmpSal in outer.DefaultIfEmpty()
            select new
            {
                Id = dtEmpRow.Field<string>("EmpId"),
                Name = dtEmpRow.Field<string>("EmpName"),
                Salary = ((dtEmpRow == null) ? "(no salary)" : dtEmpSal.Field<string>("Salary"))
            };
}

OriginaleL’autore Ashish Charan | 2013-06-19

1 risposta

  1. 7

    Che è perché qui dtEmpSal è null (default se la sequenza è vuota):

    from dtEmpSal in outer.DefaultIfEmpty() //dtEmpSal is null

    Quando si sta tentando di chiamare Field<T> estensione DataRow che è nullo, si ottiene che la eccezione:

    dtEmpSal.Field<string>("Salary") //System.ArgumentException

    Risolvere il problema con operatore ternario. È stato vicino, ma controllato un valore errato:

    from dtEmpRow in empInfo
    join dtEmpSal in empSal
        on dtEmpRow.Field<string>("EmpId") equals dtEmpSal.Field<string>("EmpId")
    into outer
    from dtEmpSal in outer.DefaultIfEmpty()
    select new
    {
        Id = dtEmpRow.Field<string>("EmpId"),
        Name = dtEmpRow.Field<string>("EmpName"),
        //here instead of dtEmpRow you should check dtEmpSal
        Salary = (dtEmpSal == null) ? "(no salary)" : dtEmpSal.Field<string>("Salary")
    };
    Grazie per la rapida risposta. Il tuo suggerimento è stato risolto il problema.

    OriginaleL’autore Sergey Berezovskiy

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *