the sample values do look constructed. Instead of Filter processing we can use the technique of merging rows with a group by

dt3 =
(From d In dt1.AsEnumerable.Concat(dt2.AsEnumerable)
Group d By k1=d("Name").toString.Trim, k2=d("Product").toString.Trim Into grp=Group
Let rpr = grp.OrderBy(Function (g) If(isNothing(g("Price")), 0, g("Price").toString.Trim.Length)).Last()
Let pr = rpr("Price")
Let pos = {dt1.Rows.IndexOf(rpr),dt2.Rows.IndexOf(rpr)}.Max()
Order By pos
Let ra = New Object(){k1,k2,pr}
Select r = dt3.Rows.Add(ra)).CopyToDataTable
