Registriert Datatable mit List
Frage
Ich habe eine Datentabelle und eine Liste von Objekten. Ich brauche alle Zeilen in der Datentabelle zurückzukehren, wo eine Eigenschaft in der Liste ein bestimmte Wert ist. Die Liste ist nur zur Filterung der Datentabelle verwendet wird (aber die Filtersäule wird in der Datentabelle nicht containined).
Ich bin sicher, dass dies mit LINQ möglich sein muss.
Die Datentabelle enthält:
MembershipID Username Password
1 blah blah
2 blah blah
3 blah blah
Meine Liste enthält:
MembershipID Profile1 Profile2 Profile3 DifferentID
1 blah blah blah A
2 blah blah blah B
3 blah blah blah C
Ich brauche (als Datatable) zurückzukehren - zB: für GetUsersByDifferentID ( "B"):
MembershipID Username Password
2 blah blah
...
Ich kann die zweite Tabelle als Datentabelle, wenn das wäre es einfacher machen, aber ich denke, was ich brauche, ist möglich mit LINQ. Ich kann einfach nicht meinen Kopf um die magische Syntax.
Lösung
Sie können es mit einem 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);
Die Änderung where-Klausel den tatsächlichen Wert verwenden Sie passen wollen ...
Andere Tipps
Wie wäre es so etwas wie dieses. Lassen Sie uns sagen, dass Ihre Liste eine Sammlung dieser Klasse ist:
public class SomeMemberClass
{
public int MembershipId { get; set; }
public char DifferentId { get; set; }
//..some more properties
}
Dann können Sie etwas tun:
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();
Im Grunde zunächst erhalten alle verschieden DifferentId des und dass dann können Sie durch Ihre Tabelle suchen.
ich darüber bin nicht sicher, weil ich so viel über Datentabelle konnte nicht verstehen, die Sie erwähnen, aber können Sie versuchen, diese
var usersByDifferentId = yourList.Where(a=> a["DifferentID"] == "B").Select(a=> new {a["UserName"],a["MemberShipID"],a["Password"]});
Ich glaube, Sie wollen so etwas wie:
var memberIds = myList.Where(u => u.DifferentID == "B").Select(a => a.MembershipID);
var credentials = myDataTable.Where(d => memberIds.Contains(d.MembershipID));
Es kann ein effizienter Weg, es zu tun, aber so etwas wie das funktionieren soll.