Вопрос

У меня есть DataTable и список объектов. Мне нужно вернуть все строки в DataTable, где свойство в списке является определенным значением. Список используется только для фильтрации таблицы данных (но столбец фильтра не содержится в таблице данных).

Я уверен, что это возможно с LINQ.

DataTable содержит:

MembershipID  Username   Password   
1              blah        blah      
2              blah        blah      
3              blah        blah      

Мой список содержит:

MembershipID  Profile1   Profile2   Profile3 DifferentID   
1              blah        blah      blah    A             
2              blah        blah      blah    B             
3              blah        blah      blah    C            

Мне нужно вернуть (как DataTable) - например: для GetUsersByDifferentID (" B "):

MembershipID  Username   Password   
2              blah        blah      
...

Я мог бы получить вторую таблицу в виде DataTable, если бы это было проще, но я думаю, что мне нужно с LINQ. Я просто не могу разобраться с магическим синтаксисом.

Это было полезно?

Решение

Вы можете сделать это, используя соединение:

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);

Измените предложение where, чтобы использовать фактическое значение, которое вы хотите сопоставить ...

Другие советы

Как насчет этого? Допустим, ваш список представляет собой коллекцию этого класса:

public class SomeMemberClass
{
    public int MembershipId { get; set; }
    public char DifferentId { get; set; }
    //..some more properties
}

Тогда вы можете сделать что-то вроде этого:

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();

По сути, сначала получите все различные DifferentId, а затем используйте их для просмотра таблицы.

Я не уверен в этом, потому что я не мог понять, что такое дата, о которой вы упоминаете, но можете ли вы попробовать это

var usersByDifferentId = yourList.Where(a=> a["DifferentID"] == "B").Select(a=> new {a["UserName"],a["MemberShipID"],a["Password"]});

Я думаю, вы хотите что-то вроде:

var memberIds = myList.Where(u => u.DifferentID == "B").Select(a => a.MembershipID);
var credentials = myDataTable.Where(d => memberIds.Contains(d.MembershipID));

Может быть более эффективный способ сделать это, но что-то подобное должно сработать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top