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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top