在搜索结果中搜索了几个答案,但无法理解。
使用以下课程
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"}
答案 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();