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