Linq no está en seleccionar en datatable

Hola, tengo 2 tablas de datos (lista prohibida, countryylist), ambas contienen una lista de nombres de países y códigos en las columnas cc y country. Estoy tratando de hacer una consulta donde puedo seleccionar países de la tabla de compatriotas que no están en la tabla de listas prohibidas para crear una tercera tabla.

¿Algunas ideas?

No he llegado demasiado lejos con esto.

var ccList = ds.Tables[2].AsEnumerable(); var bannedCCList = ds.Tables[1].AsEnumerable(); var query = from r in ccList.... 

..

después de intentar

 var bannedCCList = ds.Tables[1].AsEnumerable(); var query = from r in ccList where !bannedCCList.Any(b => b["cc"] == r["cc"])select r; 

Todavía tengo la misma lista de países. Los prohibidos no han sido eliminados. Aquí hay más detalles para explicar más. no estoy seguro de lo que estoy haciendo mal

  protected void BindCountryBan(string subd) { DataSet ds = new DataSet(); ds = new DB().CountryBan_GetSiteSettings(); BannedCountryListBox.DataSource = ds.Tables[1]; BannedCountryListBox.DataValueField = "cc"; BannedCountryListBox.DataTextField = "country"; BannedCountryListBox.DataBind(); //bind country list var ccList = ds.Tables[2].AsEnumerable(); var bannedCCList = ds.Tables[1].AsEnumerable(); var query = from r in ccList where !bannedCCList.Any(b => b["cc"] == r["cc"])select r; //var query = ccList.Except(bannedCCList); //CountryListBox.DataSource = ds.Tables[2]; DataTable boundTable = query.CopyToDataTable(); CountryListBox.DataSource = boundTable; CountryListBox.DataValueField = "cc"; CountryListBox.DataTextField = "country"; CountryListBox.DataBind(); } 

Excepto que funcionaría si lo usas en secuencias de los países:

 using System.Linq; ... var ccList = from c in ds.Tables[2].AsEnumerable() select c.Field("Country"); var bannedCCList = from c in ds.Tables[1].AsEnumerable() select c.Field("Country"); var exceptBanned = ccList.Except(bannedCCList); 

Si necesita las filas completas donde los países no están prohibidos, puede probar una combinación externa izquierda:

  var ccList = ds.Tables[2].AsEnumerable(); var bannedCCList = ds.Tables[1].AsEnumerable(); var exceptBanned = from c in ccList join b in bannedCCList on c.Field("Country") equals b.Field("Country") into j from x in j.DefaultIfEmpty() where x == null select c; 

Puedes usar el método de extensión Except () LINQ de esta manera:

 var result = full.Except(banned); 

Sin embargo, esto funcionará bien con el comparador predeterminado del tipo contenido. Por lo tanto, si desea usar una columna específica como en su ejemplo, podría necesitar otro enfoque como:

 from r in ccList where !bannedCCList.Any(b => b["cc"] == r["cc"]) select r; 

Usar Except () implica que las referencias son las mismas en ambas colecciones, lo que creo que no es el caso de las Tablas, o me corrigen si estoy equivocado.

Prueba esto:

 var query = ccList.Except(bannedCCList);