📜  .netstandard distinctby iqueryable - C# (1)

📅  最后修改于: 2023-12-03 14:59:01.676000             🧑  作者: Mango

概述

在使用C# 编写.NET应用程序时,有时需要对IQueryable进行Distinct操作,此时可以使用DistinctBy方法实现。DistinctBy是LINQ中的一个方法,可以用于通过指定的键选择不同的元素。而.NET Standard是一个语言无关的规范,可以让开发人员在不同的平台上共享代码。在这篇文章中,我们会介绍如何在.NET Standard中使用DistinctBy方法,以及如何将其应用于IQueryable。

DistinctBy方法

在C# 中,可以使用Distinct方法去重。但是,如果我们需要通过指定的键选择不同的元素,便可以使用DistinctBy方法。DistinctBy方法通常由第三方库实现,比如LinqExtensions库。

下面是一个使用DistinctBy方法的例子:

using System.Linq;
using LinqExtensions;

public class Person {
   public int Id { get; set; }
   public string Name { get; set; }
}

public void Main() {
   var people = new List<Person> {
      new Person { Id = 1, Name = "John" },
      new Person { Id = 2, Name = "Tom" },
      new Person { Id = 3, Name = "John" },
      new Person { Id = 4, Name = "Alice" }
   };
   
   var distinctPeople = people.DistinctBy(p => p.Name);
   
   foreach (var person in distinctPeople) {
      Console.WriteLine(person.Name);
   }
}

输出结果:

John
Tom
Alice

IQueryable

IQueryable 是.NET中的一个接口,它派生自IEnumerable。IQueryable 接口具有延迟执行(deferred execution)和提供数据源进行查询的能力。它提供了高度灵活的数据查询功能,支持像LINQ这样的查询语言。

当IQueryable查询被执行时,它会将查询转换为与数据源特定的命令。这些命令可以是SQL查询、Web服务调用、文件遍历等等。因此,通过IQueryable 查询,可以在服务器端执行查询,而不是将整个数据集下载到客户端执行查询。

在IQueryable上使用DistinctBy方法

由于IQueryable是查询的准备器或生成器(query provider),它不支持我们定义的任何方法。对于IQueryable,我们需要将其转换为表达式树(Expression Tree),然后将其转换为特定于数据源的命令。因此,我们需要在特定于数据源的查询提供程序中实现DistinctBy方法。

采用以下步骤来处理IQueryable:

1.先将IQueryable 转化成IEnumerable;

2.然后使用DistinctBy()方法进行去重;

3.最后将数据重新转换回IQueryable。

以下是具体代码:

using System.Linq;
using LinqExtensions;

public static class QueryableExtensions {
   public static IQueryable<TSource> DistinctBy<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector) {
      return source.AsEnumerable().DistinctBy(keySelector).AsQueryable();
   }
}

现在,我们在IQueryable上就可以直接使用DistinctBy方法了:

using System.Linq;
using MyApp.Extensions;

public class Person {
   public int Id { get; set; }
   public string Name { get; set; }
}

public class MyDataContext : DbContext {
   public DbSet<Person> People { get; set; }
}

public class MyDataService {
   private readonly MyDataContext _context;

   public MyDataService(MyDataContext context) {
      _context = context;
   }

   public IQueryable<Person> GetDistinctPeople() {
      return _context.People.DistinctBy(p => p.Name);
   }
}

这样,我们就可以在IQueryable上使用DistinctBy方法了。

结论

DistinctBy是一个非常有用的方法,可以让我们通过指定的键选择不同的元素。同时,使用IQueryable查询,可以在服务器端执行查询,获取更好的性能。借助第三方库LinqExtensions,我们可以在.NET Standard中使用DistinctBy方法,并将其应用于IQueryable。