在我的LINQ to SQL设置中,我有多个表映射到类,这些类基本上支持相同的接口以支持版本控制,即:
LINQ to SQL 类从这个接口派生,如下所示:
现在我想定义一种DRY(不要重复自己)的过滤
当与
public interface IValid
{
int? validTo { get; }
int validFrom { get; }
}
LINQ to SQL 类从这个接口派生,如下所示:
public partial class representationRevision : IValid
{
}
现在我想定义一种DRY(不要重复自己)的过滤
EntitySet<T>
,IEnumerable<T>
和IQueryable<T>
的方法,以便最终列表适用于特定版本。我尝试过以下方法:public static class ExtensionMethods
{
public static IQueryable<T> ValidFor<T>(this IQueryable<T> v, int? revision)
where T : IValid
{
return v.Where(cr => ((cr.validFrom <= revision) &&
((cr.validTo == null) || (cr.validTo > revision)))
|| ((revision == null) && (cr.validTo == null))
);
}
}
但是这会给 EntitySet<T>
带来问题。我为 EntitySet 添加了一个特殊的实现,它首先调用 AsQueryable(),但这会抛出一个异常。尽管如此,我还是试图创建一个谓词,以便可以使用 Where(predicate)
方法:
public static Expression<Func<contentRevision, bool>> IsValidFor(int? revision)
{
return ((cr) => ((cr.validFrom <= revision) &&
((cr.validTo == null) || (cr.validTo > revision)))
|| ((revision == null) && (cr.validTo == null)));
}
当与
.Where<contentRevision>(IsValidFor(revision))
一起使用时,会出现以下错误:
请注意,即使没有使用 IValid 接口,也是如此... 我已经尝试了各种变化(比如添加 int 参数),但它们似乎都失败了。有什么指针可以让我朝着正确的方向前进呢?Error 5 'System.Data.Linq.EntitySet' does not contain a definition for 'Where' and the best extension method overload
'System.Linq.Enumerable.Where (System.Collections.Generic.IEnumerable, System.Func)' has some invalid arguments
contentRevision
,这是打字错误吗?我希望它应该是IValid
。此外,您在底部显示的错误似乎是由于传递了具有3个类型参数的谓词所导致的。如果按照所示(Expression<Func<IValid, bool>>
)传递谓词会发生什么情况?我经常使用它,它可以正常工作,我无法从您的帖子中弄清楚为什么您的代码无法编译。 - Jon M