Присоединитесь к DataTable со списком < SomeObject >
Вопрос
У меня есть 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));
Может быть более эффективный способ сделать это, но что-то подобное должно сработать.