在多列实体框架LINQ上的Distinct

本文关键字:LINQ 上的 Distinct 框架 实体 | 更新日期: 2024-10-19 18:22:43

的LINQ等价物是什么

Select DISTINCT A, B, C from TESTDB WHERE ALPHA =1

我正在尝试这样的东西:

var data = TESTDB.WHERE(i=>i.ALPHA==1).SELECT(A,B,C).DISTINCT();

在多列实体框架LINQ上的Distinct

使用匿名对象可以做到这一点:

var data = TESTDB.Where(i => i.ALPHA == 1).Select(i => new {i.A, i.B, i.C}).Distinct();

保留模型:

List<Book> books = db.Book.Select(i => new Book {Author = i.Author, Title = i.Title}).Distinct().ToList();

您也可以尝试

db.Table
  .OrderBy(m=>m.Name)
  .DistinctBy(m=> new{m.SerialNumber, m.Manufacturer})
  .ToList();

如果你这样使用它:

var list = new List<Pet>()
                       {
                           new Cat() {Name = "Kitty", Id = 1},
                           new Cat() {Name = "Kitty", Id = 1},
                           new Cat() {Name = "Kitty", Id = 1}
                       };
var distinctCount = list.Where(i => i.Id == 1).Distinct().Count();

原来distinctCount等于3。为什么?似乎默认情况下,Distinct会区分实例(即使所有属性的值都相同,但它们是三个实例)。

您应该实现自定义比较器,在这里您可以找到代码示例:http://msdn.microsoft.com/en-us/library/bb338049.aspx.

但是我不知道你为什么要选择三个属性(A,B,C)。您可以通过以下方式访问单个属性:

var data = list.Where(i => i.Id == 1).Distinct().SelectMany(i => i.Name);

然而,为了选择多个属性,您应该将整个对象强制转换为包含这些属性的某个类:

var data = list.Where(i => i.Id == 1).Cast<Pet>().Distinct().ToList();