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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top