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

本文关键字:内部对象 Linq 选择 使用 | 更新日期: 2023-09-27 18:12:31

在SO中搜索了几个答案,但没有找到。

使用下面的类

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

我想要一个表的列表,但不同的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"}         

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

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

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

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


编辑:我跳过了问题中通过DatabaseSchema和Name指定唯一性的部分。这可以很容易地通过对上面的LINQ查询做一个小改动来实现:
var listOFTables = cols.Select(c => c.Table)
    .ToLookup(k => new {k. Database, k.Schema, k.Name}, v=> v)
    .Select(k => k.First());

我很确定您可以使用自定义比较器完成此任务。

try this:

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