我可以使用IQueryable <t>吗?</t>

时间:2009-11-27 05:05:11

标签: .net linq linq-to-sql linq-to-entities linq-to-objects

是否可以向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)

这可能吗?

(我不太确定它的正式名称是什么......关于我想要做什么)

1 个答案:

答案 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();