C# 使用接口的WCF查询拦截器中的通用筛选逻辑

C# 使用接口的WCF查询拦截器中的通用筛选逻辑,c#,linq,wcf,interface,expression,C#,Linq,Wcf,Interface,Expression,我的数据模型中的类实现了一个接口: public class SomeType : ISomeInterface public interface ISomeInterface 在我的WCF查询拦截器中,我想使用一个通用的表达式,以便在多种类型上使用相同的过滤逻辑: [QueryInterceptor("SomeType")] public Expression<Func<SomeType, bool>> SomeTypeInterceptor() { //

我的数据模型中的类实现了一个接口:

public class SomeType : ISomeInterface

public interface ISomeInterface
在我的WCF查询拦截器中,我想使用一个通用的
表达式
,以便在多种类型上使用相同的过滤逻辑:

[QueryInterceptor("SomeType")]
public Expression<Func<SomeType, bool>> SomeTypeInterceptor()
{
    // Return CommonFilter() or extend it with logic unique to SomeType
}

private Expression<Func<ISomeInterface, bool>> CommonFilter()
{
    // Use ISomeInterface methods and properties to build expression
    // ...
}
[QueryInterceptor(“SomeType”)]
公共表达式SomeTypeInterceptor()
{
//返回CommonFilter(),或使用SomeType特有的逻辑对其进行扩展
}
私有表达式CommonFilter()
{
//使用接口方法和属性生成表达式
// ...
}
问题是如何使
表达式
表达式
协调一致

尝试#1

仅返回公共表达式不会编译:

[QueryInterceptor("SomeType")]
public Expression<Func<SomeType, bool>> SomeTypeInterceptor()
{
    return CommonFilter();
}
[QueryInterceptor(“SomeType”)]
公共表达式SomeTypeInterceptor()
{
返回CommonFilter();
}
错误如下:

无法将类型
System.Linq.Expressions.Expression
隐式转换为
System.Linq.Expressions.Expression

尝试#2

使用查询侦听器定义中的接口:

[QueryInterceptor("SomeType")]
public Expression<Func<ISomeInterface, bool>> SomeTypeInterceptor()
[QueryInterceptor(“SomeType”)]
公共表达式SomeTypeInterceptor()
编译,但WCF不喜欢这样,会向客户端返回错误:

类型“DataService”上方法“SomeTypeInterceptor”的返回类型为
System.Linq.Expressions.Expression
类型,但查询侦听器需要可分配给
System.Linq.Expressions.Expression的类型

尝试#3

看着这些问题,我尝试实施:

[QueryInterceptor(“SomeType”)]
公共表达式SomeTypeInterceptor()
{
表达式类型表达式=
someType=>CommonFilter().Compile().Invoke(someType);
返回sometypexpression;
}
但现在LINQ to Entities不喜欢这样,返回一个错误:

LINQ to Entities无法识别方法“Boolean Invoke(ISomeInterface)”方法,并且无法将此方法转换为存储表达式



有没有一种方法可以在WCF查询拦截器中使用公共逻辑?

使
CommonFilter
方法具有泛型类型参数上所需的接口约束以及
约束(LINQ需要实体):

private Expression CommonFilter()
其中T:类,接口
{
//使用接口方法和属性生成表达式
// ...
}
然后使用稍微修改过的尝试版本#1(编译):

[QueryInterceptor(“SomeType”)]
公共表达式SomeTypeInterceptor()
{
返回CommonFilter();
}
[QueryInterceptor("SomeType")]
public Expression<Func<SomeType, bool>> SomeTypeInterceptor()
{
    Expression<Func<SomeType, bool>> someTypeExpression =
        someType => CommonFilter().Compile().Invoke(someType);

    return someTypeExpression;
}
private Expression<Func<T, bool>> CommonFilter<T>()
    where T : class, ISomeInterface
{
    // Use ISomeInterface methods and properties to build expression
    // ...
}
[QueryInterceptor("SomeType")]
public Expression<Func<SomeType, bool>> SomeTypeInterceptor()
{
    return CommonFilter<SomeType>();
}