如果我在许多查询中必须使用相同的条件,有没有一种方法可以编写类似表达式的东西并在所有这些查询中使用它?

例如:

-oh my 天.

Context.Products.Where(p => P.active&&!p.Delete&&!p.Hidden && //other conditions)

-oh my 天.

Context.Products.Where(p => P.active&&!p.Delete&&!p.Hidden && //other conditions)

-oh my 天.

Context.Products.Where(p => P.active&&!p.Delete&&!p.Hidden && //other conditions)

所有查询中都使用了重复的条件:

P.active&&!p.Delete&&!p.Hidden

所以,如果我可以编写一次它们,并 for each 查询使用类似以下内容的内容:

条件(方法、表达式或...)=p.active&&!p已删除&& !p.Hidden

Conext.Products.Where(p=>Conditions&&//其他条件)

你知道吗?

推荐答案

假设Context.ProductsDbSet<Product>:

public static class QueryableExtensions
{
// Pick your preferred name, this is just to showcase
    public static IQueryable<Product> Valid (this IQueryable<Product> unfiltered)
       => unfiltered.Where(p => p.active)
                    .Where(p => !p.deleted)
                    .Where(p => !p.hidden)
                 // ... more 

      // you can also write it like this:
      // unfiltered.Where(p => p.active && !p.deleted && !p.hidden)
}

用法

var filtered = await Context.Products.AsQueryable().Valid().ToListAsync();

注意:这与@Magnus answer的不同之处仅在于它被实现为extension method.所以它们在功能上应该基本相同.


EF Core也有Global Query Filters个.但我不知道这是不是你要找的.它们有some个怪癖和缺点,所以我不太愿意推荐它们.

基本上,他们会在all个查询上添加一个过滤器.如果你不想要它,你需要明确地 Select 退出.

doctor 们对它们的理解如下:

全局查询筛选器是应用于元数据模型(通常在OnModel Creating中)中的实体类型的LINQ查询谓词.查询谓词是通常传递给LINQ WHERE查询操作符的布尔表达式.EF Core applies such filters automatically to any LINQ queries involving those Entity Types. EF Core还将它们应用于通过使用Include或导航属性间接引用的实体类型.此功能的一些常见应用包括:

Soft delete - An Entity Type defines an IsDeleted property.
Multi-tenancy - An Entity Type defines a TenantId property.

(我强调)

我的个人经验是:使用它们can有时会导致混淆.我的意思是:在我们的代码库中,我们在some个Out-out case 中有and个gqf.现在,为了找出您当前正在编写的代码中是否实际使用了过滤器,频繁地浏览代码并不少见……

Csharp相关问答推荐

为什么在GuardationRule的收件箱函数中,decode.TryParse(valueString,out valueParsed)在给出1.0.1时返回true?

更改对象的旋转方向

ITypeLib2.GetLibStatistics()在C#中总是抛出AccessViolationException

自动映射程序在GroupBy之后使用项目

UWP中的任务和界面

使用可信第三方的Iext8.Net pdf签名

Rx.Net窗口内部可观测数据提前完成

如何使用MoQ模拟Resources GroupCollection?

在IAsyncEnumerable上先调用,然后跳过(1)可以吗?

如何将MemberInitExpression添加到绑定中其他Lambda MemberInitExpression

如何在我的C#应用程序中设置带有reactjs前端的SignalR服务器?

使用System.Text.Json进行序列化时发生StackOverflow异常

为值对象编写自定义JsonConverter

具有类型识别的泛型方法

如何将%{v_扩展}转换为%{v_扩展}>>

当我try 在与XAMP的MySQL服务器连接的ASP.NET核心应用程序中添加迁移时出现错误

将C#类导入到PowerShell

在C#中通过Matheval使用自定义公式

我如何为我的Blazor应用程序构建一个动态教程标注?

C#Web服务转换为 node /Express不工作