模糊的IQueryable<;T>;.其中和IEnumerable<;T>;.扩展方法上的Where

本文关键字:lt gt 扩展 方法 Where IEnumerable 模糊 IQueryable | 更新日期: 2023-09-27 18:21:38

我正试图用以下扩展方法覆盖实体的所有Where()方法:

public static IQueryable<T> Where<T>(this IQueryable<T> source, Expression<Func<T, bool>> predicate)
{
    throw new SecurityException("Use the security SafeWhere method");
}

但是当我使用context.EntitesX.Where()时,我会得到错误:调用在Queryable<TSource>(IQueryable<TSource>,Expression<Func<TSSource,bool>>)和Enumerable<TSource>(IEnumerable<TSource>,Expression<Func<TSource,bool>>)

我该怎么解决?此外,我希望该扩展方法只影响实现特定接口的实体,我已经尝试过指定接口类型而不是通用的T,但这不起作用。

模糊的IQueryable<;T>;.其中和IEnumerable<;T>;.扩展方法上的Where

诀窍是赋予您的扩展方法比第三方(系统)方法更高的优先级。

假设你的代码结构类似于

MyExtensions.cs

using System;
// ... other 3rd party usings
namespace MyExtensionsNamespace
{
    public static class MyExtensions
    {
        public static IQueryable<T> Where<T>(this IQueryable<T> source, Expression<Func<T, bool>> predicate)
        {
            throw new SecurityException("Use the security SafeWhere method");
        }
        // ...
    }
}

MyEntity.cs

using System;
using System.Linq;
// ... other 3rd party usings
using MyExtensionsNamespace;
namespace MyEntitiesNamespace
{
    // ...
}

你所需要的只是在你的名称空间声明之后移动你的名称名称空间using,就像这个

MyEntity.cs

using System;
using System.Linq;
// ... other 3rd party usings
namespace MyEntitiesNamespace
{
    using MyExtensionsNamespace;
    // ...
}

附言:编译器错误消息具有误导性。它是在使用扩展方法语法时生成的。对于LINQ语法,错误是不同的

错误CS1940为源类型"DbSet"找到查询模式的多个实现。对"Where"的调用不明确。

此外,我希望这种扩展方法只影响实现特定接口的实体,

尝试在扩展方法上设置一个通用约束:

public static IQueryable<T> Where<T>(this IQueryable<T> source, Expression<Func<T, bool>> predicate)
    where T : IMyInterface
{
    throw new SecurityException("Use the security SafeWhere method");
}

尽管我仍然认为你应该选择一个不同的名字,以避免其他人阅读你的代码时感到困惑。