我有一个DataTable和一个对象列表。我需要返回DataTable中List中的属性是特定值的所有行。 List仅用于过滤数据表(但过滤器列不包含在数据表中)。
我确信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) - 例如:for GetUsersByDifferentID(“B”):
MembershipID Username Password
2 blah blah
...
我可以将第二个表作为DataTable获取,如果这样可以更容易,但我认为我需要的是LINQ。我无法理解魔法语法。
答案 0 :(得分:2)
这样的事情怎么样?假设您的列表是此类的集合:
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,然后使用它来查看表格。
答案 1 :(得分:2)
您可以使用联接:
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子句以使用您想要匹配的实际值...
答案 2 :(得分:1)
我不确定这个,因为我无法理解你提到的数据表,但你可以尝试这个
var usersByDifferentId = yourList.Where(a=> a["DifferentID"] == "B").Select(a=> new {a["UserName"],a["MemberShipID"],a["Password"]});
答案 3 :(得分:0)
我想你想要这样的东西:
var memberIds = myList.Where(u => u.DifferentID == "B").Select(a => a.MembershipID);
var credentials = myDataTable.Where(d => memberIds.Contains(d.MembershipID));
可能有一种更有效的方法,但这样的事情应该有用。