C# 将数据表与列表联接<;SomeObject>;

C# 将数据表与列表联接<;SomeObject>;,c#,linq,join,datatable,C#,Linq,Join,Datatable,我有一个数据表和一个对象列表。我需要返回DataTable中列表中属性为某个值的所有行。该列表仅用于筛选datatable(但datatable中不包含筛选器列) 我相信这在LINQ身上一定是可能的 数据表包含: MembershipID Username Password 1 blah blah 2 blah blah 3 blah bla

我有一个数据表和一个对象列表。我需要返回DataTable中列表中属性为某个值的所有行。该列表仅用于筛选datatable(但datatable中不包含筛选器列)

我相信这在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            
我的名单包括:

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”):


我可以将第二个表作为DataTable,如果这会使它更简单的话,但是我认为我需要的是LINQ。我只是无法理解神奇的语法。

我不确定这一点,因为我不太了解您提到的datatable,但您能试试吗

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

我对此不确定,因为我对你们提到的datatable不太了解,但你们能试试这个吗

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

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

我想你需要这样的方法:

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

也许有一种更有效的方法可以做到这一点,但类似的方法应该会奏效。

像这样的方法怎么样。假设您的列表是此类的集合:

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();
DataTable=newdatatable();
表.Columns.Add(“MembershipId”,typeof(int));
表.列.添加(“用户名”);
表.列.添加(“密码”);
列表=新列表()//或者从其他地方获取列表。。。
var differntIds=list.Select(s=>s.differntid.Distinct();
var result=table.AsEnumerable()
其中(dt=>differntIds
.包含((int)dt[“MembershipId”]))
.CopyToDataTable();

基本上,首先获得所有明显的差异,然后使用这些差异查看您的表格。

类似的内容如何。假设您的列表是此类的集合:

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();
DataTable=newdatatable();
表.Columns.Add(“MembershipId”,typeof(int));
表.列.添加(“用户名”);
表.列.添加(“密码”);
列表=新列表()//或者从其他地方获取列表。。。
var differntIds=list.Select(s=>s.differntid.Distinct();
var result=table.AsEnumerable()
其中(dt=>differntIds
.包含((int)dt[“MembershipId”]))
.CopyToDataTable();

基本上,首先获取所有不同的DifferentId,然后使用它查看表。

您可以使用连接:

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);
List listItems=//随便什么
DataTable dtItems=//无论什么
IEnumerable matchingRows=列表项
.Join(dtItems.AsEnumerable(),
listItem=>listItem.MembershipID,
row=>row.Field(“MembershipID”),
(r,li)=>new{DifferentId=li.DifferentId,Row=r})
.Where(ji=>ji.DifferentID==“B”)
.Select(ji=>ji.Row);

更改where子句以使用要匹配的实际值…

您可以使用连接:

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);
List listItems=//随便什么
DataTable dtItems=//无论什么
IEnumerable matchingRows=列表项
.Join(dtItems.AsEnumerable(),
listItem=>listItem.MembershipID,
row=>row.Field(“MembershipID”),
(r,li)=>new{DifferentId=li.DifferentId,Row=r})
.Where(ji=>ji.DifferentID==“B”)
.Select(ji=>ji.Row);

更改where子句以使用要匹配的实际值…

我需要它,但反过来说,根据列表中的差异从数据表返回匹配行。我需要它,但反过来说,根据列表中的差异从数据表返回匹配行。我想你已经接近了。我认为您不必担心不同的列表条目,因为OP似乎正在使用该列表作为查找引用。我的理解是:传入DifferentID,查看列表并获取MembershipID,然后使用它从DataTable返回匹配的行(然后将其作为自己的DataTable返回)。我只是在执行distinct,因此当调用列表上的Contains时,它必须查看较少的元素。我想你已经接近了。我认为您不必担心不同的列表条目,因为OP似乎正在使用该列表作为查找引用。我的理解是:传入DifferentID,查看列表并获取MembershipID,然后使用它从DataTable返回匹配的行(然后将其作为自己的DataTable返回)。我只是在执行distinct,以便在调用列表上的Contains时,它必须查看较少的元素。@Lee当我试图返回
ListCollection
时,它抛出了一个异常。
{System.NotSupportedException:LINQ to Entities无法识别方法System.Data.EnumerablerRowCollection1[System.Data.DataRow]AsEnumerable(System.Data.DataTable)'方法,此方法无法转换为存储表达式。
@Lee当我尝试返回
ListCollection
时,它引发异常。
{System.NotSupportedException:LINQ to Entities无法识别方法System.Data.EnumerableRowCollection1[System.Data.DataRow]AsEnumerable(System.Data.DataTable)'方法,此方法无法转换为存储表达式。