模糊的IQueryable <t> .Where和IEnumerable <t>。在扩展方法上

时间:2015-11-12 17:49:45

标签: c# linq generics entity-framework-6 extension-methods

我尝试使用以下扩展方法覆盖我的实体的所有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.EntitiesX.Where()时,我收到错误:在Queryable&lt; TSource&gt;(IQueryable&lt; TSource&gt;,Expression&lt;)之间调用是不明确的。 Func&lt; TSource,bool&gt;&gt;)和Enumerable&lt; TSource&gt;(IEnumerable&lt; TSource&gt;,Expression&lt; Func&lt; TSource,bool&gt;&gt;&gt;)

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

2 个答案:

答案 0 :(得分:1)

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

假设你的代码结构是这样的

<强> 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
{
    // ...
}

您需要的就是在命名空间声明之后立即使用名称空间来移动命名空间

<强> MyEntity.cs

using System;
using System.Linq;
// ... other 3rd party usings

namespace MyEntitiesNamespace
{
    using MyExtensionsNamespace;
    // ...
}

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

  

错误CS1940找到源类型“DbSet”的查询模式的多个实现。暧昧地打电话给'哪里'。

答案 1 :(得分:0)

  

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

尝试在扩展方法上添加通用约束:

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");
}

虽然我仍然认为你应该选择一个不同的名字,以免其他人在阅读你的代码时产生混淆。