Как я могу вернуть IQueryable в C # 3.0, не зная его типа? - PullRequest
3 голосов
/ 11 мая 2009

У меня есть метод, в котором я выполняю запрос SQL (я использую Linq to SQL, но мне нужно выполнить классический запрос SQL), но я не знаю, из какой таблицы / сущности будет сгенерирован этот запрос.

Итак, я подумал, что, поскольку я не знаю, из какой таблицы будет сгенерирован запрос, я не знаю тип моего IQueryable, я прав?

Но я не знаю, как вернуть это IQueryable? Я пытался вернуть <T>, но он не работает.

Спасибо!

Ответы [ 2 ]

1 голос
/ 21 августа 2009

Вы можете построить IQueryable<T> внутри метода, а затем сделать метод универсальным. Если вы сделаете это, вы сможете вернуть IQueryable<T> напрямую, а компилятор C # может использовать вывод типа, чтобы определить, что T было во время компиляции. Это эффективно, как большинство операторов Linq построены, за исключением того, что они реализованы как методы расширения.

Например, рассмотрим метод, который удаляет любые из списка, которые являются значениями по умолчанию для этого типа:

public static IQueryable<T> FilterDefaults<T>(IQueryable<T> theSet)
{
    IQueryable<T> query =
        from t in theSet
        where t != default(T)
        select t;

    return query;
}

Теперь, когда вы вызываете это в C #, вы можете пропустить <T>, так как вывод типа может вычислить T во время компиляции, чтобы все еще иметь строгий тип:

string[] myStrs = { "ABC", null, "", "123", null, "XYZ" };
var theFilteredStrs = FilterDefaults(myStrs);
// should represent the sequence: "ABC", "", "123", "XYZ"
// note null is missing because default(string) is null

int[] myNums = { -1, 0, 3, 0, 42 };
var theFilteredNums = FilterDefaults(myNums);
// should represent the sequence: -1, 3, 42
// note 0 is missing because default(int) is 0

Это тривиальный пример, который использует только базовые типы, но идея работает одинаково для любого использования LINQ (включая LINQ-to-SQL), которое является мощью LINQ. Не имеет значения, собираетесь ли вы в конечном итоге использовать LINQ-to-SQL или это просто LINQ-to-Objects.

0 голосов
/ 11 мая 2009

Вы не можете, как вы узнали. Поскольку вы не знаете тип, нет способа вернуть универсальный Generic (т. Е. List), единственный другой вариант для вас с тем, что вы делаете (также в любое время, когда вы хотите вернуть подмножество сильного Linq к типу Sql) создать свой собственный тип (т. е. класс или структуру), заполнить список и вернуть его ... Я думаю, у вас есть представление о столбцах, которые вы возвращаете, так что это не должно быть слишком сложно.

Надеюсь, это поможет Вкладка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...