使用List <someobject> </someobject>加入DataTable

时间:2009-09-11 16:36:01

标签: c# linq join datatable

我有一个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。我无法理解魔法语法。

4 个答案:

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

可能有一种更有效的方法,但这样的事情应该有用。