使用Linq选择内部对象的不同

时间:2016-10-11 17:17:52

标签: c# linq

在搜索结果中搜索了几个答案,但无法理解。

使用以下课程

public class DbTable
{
    public string Database { get; set; }
    public string Schema { get; set; }
    public string Name { get; set; }
}

public class DbColumn
{
    public DbTable Table { get; set; }
    public string ColumnName { get; set; }
}

List<DbColumn> cols = DataAccess.GetColumns();

cols我有很多DbColumn。其中一些具有相同的Table

我想要一个Table列表,但在Database.Schema.Name

上是不同的

我的cols看起来像是:

{"Col1", {"MyDB", "dbo", "Product"}     }   
{"Col2", {"MyDB", "dbo", "Product"}     }   
{"Col3", {"MyDB", "Sales", "Customer"}  }   
{"Col4", {"MyDB", "Sales", "Branch"}    }       
{"Col5", {"MyDB", "Sales", "Customer"}  }   
{"Col6", {"MyDB", "Sales", "Branch"}    }           

我需要的是包含以下对象的List<DbTable>

{"MyDB", "dbo", "Product"}      
{"MyDB", "Sales", "Customer"} 
{"MyDB", "Sales", "Branch"}         

3 个答案:

答案 0 :(得分:1)

LINQ应该能够做到。您需要进行Select投影,然后进行分组或查找。有点像这样:

var listOFTables = cols.Select(c => c.Table).ToLookup(k => k.Name, v=> v)
    .Select(k => k.First());

这将产生一个IEnumerable<DbTable>,其中包含您期望的3个表。


编辑:我跳过了数据库架构和名称指定单一性的问题部分。只需对上述LINQ查询稍作更改即可轻松实现:

var listOFTables = cols.Select(c => c.Table)
    .ToLookup(k => new {k. Database, k.Schema, k.Name}, v=> v)
    .Select(k => k.First());

答案 1 :(得分:0)

我很确定你可以通过自定义比较器实现这一目标。请参阅this answer

答案 2 :(得分:0)

试试这个:

  List<DbTable> ListDistinctTable = listcolum.Select(x => new { x.Table.Database, x.Table.Name, x.Table.Schema })
                                                    .Distinct()
                                                    .Select(x => new DbTable() { Database = x.Database, Name = x.Name, Schema = x.Schema })
                                                    .ToList();