Iscriviti a DataTable con Elenco < SomeObject >
Domanda
Ho una DataTable e un Elenco di oggetti. Devo restituire tutte le righe nella DataTable in cui una proprietà dell'elenco ha un determinato valore. L'elenco viene utilizzato solo per filtrare il datatable (ma la colonna del filtro non è contenuta nel datatable).
Sono sicuro che questo deve essere possibile con LINQ.
La tabella dei dati contiene:
MembershipID Username Password
1 blah blah
2 blah blah
3 blah blah
La mia lista contiene:
MembershipID Profile1 Profile2 Profile3 DifferentID
1 blah blah blah A
2 blah blah blah B
3 blah blah blah C
Devo tornare (come DataTable) - ad es .: per GetUsersByDifferentID (" B "):
MembershipID Username Password
2 blah blah
...
Potrei ottenere la seconda tabella come DataTable se ciò renderebbe più semplice, ma penso che ciò di cui ho bisogno sia possibile con LINQ. Non riesco proprio a capire la sintassi magica.
Soluzione
Puoi farlo usando un join:
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);
Modifica la clausola where per utilizzare il valore effettivo che desideri corrispondere ...
Altri suggerimenti
Che ne dici di qualcosa del genere. Supponiamo che la tua lista sia una raccolta di questa classe:
public class SomeMemberClass
{
public int MembershipId { get; set; }
public char DifferentId { get; set; }
//..some more properties
}
Quindi puoi fare qualcosa del genere:
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();
Fondamentalmente, prima prendi tutti i DifferentId distinti e poi usali per guardare attraverso la tua tabella.
Non ne sono sicuro perché non potrei capire molto di datatable di cui menzioni ma puoi provarlo
var usersByDifferentId = yourList.Where(a=> a["DifferentID"] == "B").Select(a=> new {a["UserName"],a["MemberShipID"],a["Password"]});
Penso che tu voglia qualcosa del tipo:
var memberIds = myList.Where(u => u.DifferentID == "B").Select(a => a.MembershipID);
var credentials = myDataTable.Where(d => memberIds.Contains(d.MembershipID));
Potrebbe esserci un modo più efficiente per farlo, ma qualcosa del genere dovrebbe funzionare.