【问题标题】:Common filtering logic in WCF query interceptors using interface使用接口的 WCF 查询拦截器中的常见过滤逻辑
【发布时间】:2017-03-20 16:25:58
【问题描述】:

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

public class SomeType : ISomeInterface

public interface ISomeInterface

在我的 WCF 查询拦截器中,我想使用一个通用的 Expression,以便我可以对多种类型使用相同的过滤逻辑:

[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
    // ...
}

问题是让Expression&lt;Func&lt;SomeType, bool&gt;&gt;Expression&lt;Func&lt;ISomeInterface, bool&gt;&gt; 相处。

尝试 #1

只返回普通表达式不会编译:

[QueryInterceptor("SomeType")]
public Expression<Func<SomeType, bool>> SomeTypeInterceptor()
{
    return CommonFilter();
}

出现错误:

无法将类型System.Linq.Expressions.Expression&lt;System.Func&lt;ISomeInterface, bool&gt;&gt; 隐式转换为System.Linq.Expressions.Expression&lt;System.Func&lt;SomeType, bool&gt;&gt;

尝试 #2

使用查询拦截器定义中的接口:

[QueryInterceptor("SomeType")]
public Expression<Func<ISomeInterface, bool>> SomeTypeInterceptor()

编译,但是WCF不喜欢这样,向客户端返回错误:

“DataService”类型上的“SomeTypeInterceptor”方法的返回类型是 System.Linq.Expressions.Expression&lt;System.Func&lt;ISomeInterface, System.Boolean&gt;&gt; 类型,但查询拦截器需要可分配给 System.Linq.Expressions.Expression&lt;System.Func&lt;SomeType, System.Boolean&gt;&gt; 的类型。

尝试 #3

看着问题How can I cast an expression from type interface, to an specific typeC# How to convert an Expression&lt;Func&lt;SomeType&gt;&gt; to an Expression&lt;Func&lt;OtherType&gt;&gt;,我尝试实现this answer

[QueryInterceptor("SomeType")]
public Expression<Func<SomeType, bool>> SomeTypeInterceptor()
{
    Expression<Func<SomeType, bool>> someTypeExpression =
        someType => CommonFilter().Compile().Invoke(someType);

    return someTypeExpression;
}

但现在 LINQ to Entities 不喜欢这样,返回错误:

LINQ to Entities 无法识别方法 'Boolean Invoke(ISomeInterface)' 方法,并且该方法无法转换为存储表达式。


有没有办法在 WCF 查询拦截器中使用通用逻辑?

【问题讨论】:

    标签: c# linq wcf interface expression


    【解决方案1】:

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

    private Expression<Func<T, bool>> CommonFilter<T>()
        where T : class, ISomeInterface
    {
        // Use ISomeInterface methods and properties to build expression
        // ...
    }
    

    然后使用您的 尝试 #1 的稍微修改的版本(它会编译):

    [QueryInterceptor("SomeType")]
    public Expression<Func<SomeType, bool>> SomeTypeInterceptor()
    {
        return CommonFilter<SomeType>();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-30
      • 2021-05-17
      • 2014-06-16
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      相关资源
      最近更新 更多