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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top