模糊的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,但这不起作用。
诀窍是赋予您的扩展方法比第三方(系统)方法更高的优先级。
假设你的代码结构类似于
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");
}
尽管我仍然认为你应该选择一个不同的名字,以避免其他人阅读你的代码时感到困惑。