Take a look at example:
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("ID", typeof(int)));
dt.Columns.Add(new DataColumn("Buss_Code", typeof(string)));
dt.Columns.Add(new DataColumn("Transt_Code", typeof(string)));
dt.Rows.Add(new Object[]{1, "AB", "XY"});
dt.Rows.Add(new Object[]{1, "AB", "YZ"});
dt.Rows.Add(new Object[]{1, "AB", "ABC"});
dt.Rows.Add(new Object[]{2, "CD", "BAL"});
dt.Rows.Add(new Object[]{2, "CD", "BGH"});
dt.Rows.Add(new Object[]{2, "CD", "DFR"});
dt.Rows.Add(new Object[]{3, "EF", "FRE"});
Dictionary<int, Tuple<string, string>> validDic = new Dictionary<int, Tuple<string, string>>();
validDic.Add(1, Tuple.Create("AB","XY"));
validDic.Add(2, Tuple.Create("CD","BAL"));
var result = dt.AsEnumerable()
.Select(r=> new
{
ID = r.Field<int>("ID"),
BussCode = r.Field<string>("Buss_Code"),
TranstCode = r.Field<string>("Transt_Code"),
IsValid = !validDic.ContainsKey(r.Field<int>("ID")) ? false :
r.Field<string>("Buss_Code") == validDic[r.Field<int>("ID")].Item1 &&
r.Field<string>("Transt_Code") == validDic[r.Field<int>("ID")].Item2
});
foreach(var d in result)
{
Console.WriteLine("{0} {1} {2} {3}", d.ID, d.BussCode, d.TranstCode, d.IsValid);
}
Above lambda expression is equal to:
pseudo-code:
if(condition) {resultIfTrue} else {resultIfFalse}
explanation:
if(dictionary does not contain key) {return false} else {return a result of comparison of Buss_Code and Transt_Code to items in Tuple}
Result:
ID BussCode TranstCode IsValid
1 AB XY True
1 AB YZ False
1 AB ABC False
2 CD BAL True
2 CD BGH False
2 CD DFR False
3 EF FRE False
Try!
[EDIT]
Simplified version:
var validData = dt.AsEnumerable()
.Where(r=> !validDic.ContainsKey(r.Field<int>("ID")) ? false :
r.Field<string>("Buss_Code") == validDic[r.Field<int>("ID")].Item1 &&
r.Field<string>("Transt_Code") == validDic[r.Field<int>("ID")].Item2);
Returns:
ID Buss_Code Transt_Code
1 AB XY
2 CD BAL