是否可以向IQueryable<T>
添加扩展方法,然后,对于我的Linq2Sql或EF或NHibernate或LinqToObjects,定义它的功能/每个存储库将如何实现此方法/将此方法转换为某些sql?< / p>
例如,想象一下我想要以下内容: -
var result = (from q in db.Categories()
where q.IWishIKnewHowToCode("hi")
select q).ToList();
现在,与EF或LinqToObjects等相比,扩展方法IWishIKnewHowToCode()
的代码在L2S时会有所不同。
我不是在谈论管道和过滤器。我知道该怎么做。
所以想象一下,如果这是L2S,那么该方法会执行linq Where
子句,但如果存储库是......说... LinqToObjects,它会执行Take(10)
。
这可能吗?
(我不太确定它的正式名称是什么......关于我想要做什么)
答案 0 :(得分:1)
这是非常邪恶的,但我认为最接近提供者的特殊情况:
public static class Test
{
public static IQueryable<T> IWishIKnewHowToToCode<T>(
this IQueryable<T> data, string something)
// perhaps "where T : SomeBaseTypeOrInterfaceForThePredicate"
{
switch (data.Provider.GetType().Name)
{
case "Foo": return data.Take(10);
case "Bar": return data.Where(somePredicate);
default: return data;
}
}
}
(显然还有其他方法可以启用Type
)。
然后使用通过流畅的语法(不是查询语法):
var result = db.Categories().IWishIKnewHowToCode("hi").ToList();