在.NET中使用Ardalis.Specification获取去重值的实现问题
在.NET中使用Ardalis.Specification获取去重值的实现问题
嘿,我看到你遇到的问题了——想用Ardalis.Specification从Product表中获取去重的品牌列表,但直接调用Distinct()报错说接口没有这个方法对吧?这其实是两个小细节没处理好,我来帮你捋清楚怎么解决:
问题根源
- 你错误地把
Where和Select拆成了两次独立赋值操作,这会导致两个查询逻辑没有串联起来,前面的Where过滤条件根本不会作用到后面的Select上; - Ardalis.Specification的
ISpecificationBuilder<T, TResult>接口(也就是你代码里的Query对象)默认没有直接暴露Distinct()方法,所以你直接调用会报错。
正确的实现方式
根据你使用的Ardalis.Specification版本,有两种可靠的解决办法:
方法一:如果你用的是v7.0及以上版本
这个版本之后框架新增了对Distinct()的直接支持,你只需要把查询逻辑改成链式调用即可:
public class GetDistinctManufacturersSpec : Specification<Product, string> { public GetDistinctManufacturersSpec(uint companyId) { Query.Where(x => x.CompanyId == companyId && !string.IsNullOrEmpty(x.Manufacturer)) .Select(x => x.Manufacturer) .Distinct(); } }
方法二:兼容旧版本的通用写法
如果你的版本比较低,没有内置的Distinct()扩展,我们可以通过AppendQuery()方法直接修改底层的IQueryable,让EF Core自动生成带DISTINCT关键字的SQL语句:
public class GetDistinctManufacturersSpec : Specification<Product, string> { public GetDistinctManufacturersSpec(uint companyId) { Query.Where(x => x.CompanyId == companyId && !string.IsNullOrEmpty(x.Manufacturer)) .Select(x => x.Manufacturer) .AppendQuery(query => query.Distinct()); } }
额外提醒
一定要用链式调用的方式写Query的方法(比如Where().Select().AppendQuery()这样连起来),别像你原来那样拆成两次赋值,否则前面的Where过滤会完全失效,查询结果肯定不对。
备注:内容来源于stack exchange,提问作者Hridoy_089
相关产品推荐
相关产品推荐

