Могу ли я сделать это с IQueryable <T>? - PullRequest
1 голос
/ 27 ноября 2009

возможно ли добавить метод расширения к IQueryable<T>, а затем для моих Linq2Sql или EF или NHibernate или LinqToObjects определить его функциональность / как каждый репозиторий будет реализовывать этот метод / переводить этот метод в некоторый sql?

Например, представьте, что я хочу следующее: -

var result = (from q in db.Categories()
              where q.IWishIKnewHowToCode("hi")
              select q).ToList();

теперь код для метода расширения IWishIKnewHowToCode() будет отличаться, когда он L2S, по сравнению с EF или LinqToObjects и т. Д.

Я не говорю о трубах и фильтрах здесь. Что я знаю как это сделать.

Итак, представьте, что если бы это был L2S, то этот метод сделал бы предложение linq Where, но если бы репозиторий был .. скажем ... LinqToObjects, он бы сделал Take(10).

Возможно ли это?

(я не слишком уверен, как это официально называется ... о том, что я хочу сделать)

1 Ответ

1 голос
/ 27 ноября 2009

Это довольно зло, но я могу подумать, что ближе всего к поставщику в особых случаях:

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