代码之家  ›  专栏  ›  技术社区  ›  Echilon

将DataTable与List<SomeObject>

  •  1
  • Echilon  · 技术社区  · 15 年前

    我有一个数据表和一个对象列表。我需要返回数据表中的所有行,其中列表中的属性是某个值。该列表仅用于筛选数据表(但筛选列未包含在数据表中)。

    我相信Linq一定能做到这一点。

    数据表包含:

    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            
    

    我需要返回(作为数据表)-例如:对于getUsersByDifferentid(“b”):

    MembershipID  Username   Password   
    2              blah        blah      
    ...
    

    我可以把第二个表作为数据表,如果这样做会更容易的话,但是我认为我需要的是使用LINQ。我就是无法理解魔法语法。

    4 回复  |  直到 12 年前
        1
  •  2
  •   Lee    15 年前

    您可以使用联接来完成此操作:

    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
  •  2
  •   bluish dmajkic    12 年前

    这样的怎么样?假设您的列表是此类的集合:

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

    基本上,首先得到所有不同的,然后用它浏览你的桌子。

        3
  •  1
  •   Barbaros Alp    15 年前

    我对此不确定,因为我不太了解您所提到的数据表,但是您能试试这个吗?

    var usersByDifferentId = yourList.Where(a=> a["DifferentID"] == "B").Select(a=> new {a["UserName"],a["MemberShipID"],a["Password"]});
    
        4
  •  0
  •   user170934    15 年前

    我想你想要这样的东西:

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

    也许有一种更有效的方法,但类似的方法应该奏效。