Unir DataTable con List < SomeObject >
Pregunta
Tengo una tabla de datos y una lista de objetos. Necesito devolver todas las filas en la tabla de datos donde una propiedad en la lista tiene un cierto valor. La Lista solo se usa para filtrar los datos (pero la columna del filtro no está contenida en los datos).
Estoy seguro de que esto debe ser posible con LINQ.
La tabla de datos contiene:
MembershipID Username Password
1 blah blah
2 blah blah
3 blah blah
Mi lista contiene:
MembershipID Profile1 Profile2 Profile3 DifferentID
1 blah blah blah A
2 blah blah blah B
3 blah blah blah C
Necesito regresar (como DataTable), por ejemplo: para GetUsersByDifferentID (" B "):
MembershipID Username Password
2 blah blah
...
Podría obtener la segunda tabla como DataTable si eso lo hiciera más fácil, pero creo que lo que necesito es posible con LINQ. Simplemente no puedo entender la sintaxis mágica.
Solución
Puedes hacerlo usando una combinación:
List<ListItem> listItems = //whatever
DataTable dtItems = //whatever
IEnumerable<DataRow> matchingRows = listItems
.Join( dtItems.AsEnumerable(),
listItem => listItem.MembershipID,
row => row.Field<int>("MembershipID"),
(r,li) => new { DifferentId = li.DifferentId, Row = r })
.Where( ji => ji.DifferentID == "B")
.Select( ji => ji.Row);
Cambie la cláusula where para usar el valor real que desea igualar ...
Otros consejos
¿Qué tal algo como esto? Digamos que su lista es una colección de esta clase:
public class SomeMemberClass
{
public int MembershipId { get; set; }
public char DifferentId { get; set; }
//..some more properties
}
Entonces puedes hacer algo como esto:
DataTable table = new DataTable();
table.Columns.Add("MembershipId", typeof(int));
table.Columns.Add("UserName");
table.Columns.Add("Password");
List<SomeMemberClass> list = new List<SomeMemberClass>(); //or get the list from somewhere else...
var differntIds = list.Select( s => s.DifferentId).Distinct();
var result = table.AsEnumerable()
.Where( dt => differntIds
.Contains((int)dt["MembershipId"]))
.CopyToDataTable();
Básicamente, primero obtenga todos los DifferentId's distintos y luego use eso para revisar su tabla.
No estoy seguro de esto porque no pude entender mucho acerca de los datos que mencionas, pero puedes intentar esto
var usersByDifferentId = yourList.Where(a=> a["DifferentID"] == "B").Select(a=> new {a["UserName"],a["MemberShipID"],a["Password"]});
Creo que quieres algo como:
var memberIds = myList.Where(u => u.DifferentID == "B").Select(a => a.MembershipID);
var credentials = myDataTable.Where(d => memberIds.Contains(d.MembershipID));
Puede haber una forma más eficiente de hacerlo, pero algo así debería funcionar.