как вернуть анонимный тип в linq-to-sql

У меня есть следующий фиктивный код, но идея состоит в том, чтобы вернуть общий класс

 public static var getSeaOf(string user)
        {
            var periodsSettings = from p in sea
                                  where p.add_by == new Guid(user)
                                  select new { p.id, p.name };

            return var;
        }

Я прочитал здесь - Как чтобы вернуть анонимный тип из метода C #, который использует LINQ to SQL, лучшим решением в этом случае является создание класса для возвращаемого типа.

Но мой вопрос: если у меня есть сотни таких функций, значит ли это, что мне нужны сотни классов?

Я надеюсь, что есть более универсальное решение, спасибо за вашу помощь !!


Версия

Я смотрю на

Silverlight - LinqToEntities - Как вернуть анонимные типы

Но я не могу указать имя класса в select new, как в статье?

public static IEnumerable<retSea> getBskSeasonsOf(string user)
        {
            var periodsSettings = from p in sea
                                  where p.add_by == new Guid(user)
                                  select new retSea { p.id, p.name };

            return periodsSettings;
        }

person roncansan    schedule 06.12.2010    source источник
comment
с тех пор мне никто не ответил хорошо.   -  person alansiqueira27    schedule 06.12.2010
comment
возможный дубликат Silverlight - LinqToEntities - Как вернуть анонимные типы   -  person ChrisF    schedule 06.12.2010


Ответы (5)


Вот сообщение в блоге об именовании анонимных типов в .NET с помощью функции VS 2010 Generate From Usage.

http://diditwith.net/2009/10/24/NamingAnonymousTypesWithGenerateFromUsage.aspx

person brad.huffman    schedule 06.12.2010
comment
Это интересно, хотя я предполагаю, что технически не возвращает анонимный тип. :) - person Chris; 07.12.2010
comment
Пожалуйста, всегда цитируйте небольшой фрагмент из внешних ссылок. В этом случае ссылка не работает, поэтому ваш ответ бесполезен. - person Teejay; 31.03.2017

Если я правильно помню, в спецификации говорится, что анонимный тип, сгенерированный для этого объекта, не может избежать метода, в котором он определен. Поэтому единственный метод, который может когда-либо иметь переменные этого типа, - это метод, в котором создается объект. если учесть тот факт, что запрос LINQ может быть скомпилирован в набор методов, но это волшебство.

Однако сам объект может ускользнуть от метода. Чтобы добиться этого, нужно ... вернуть object. Однако вам придется получить к нему доступ, используя отражение (или dynamic), поэтому вы потеряете безопасность типов. Вы можете подумать, стоит ли это того или нет. Скорее всего, это не так. И, скорее всего, у вас тоже нет сотен разных типов результатов - держу пари, многие из ваших запросов возвращают один и тот же тип данных. Используйте эти классы повторно.

person Matti Virkkunen    schedule 06.12.2010

Если у вас действительно сотни таких классов, просто создайте класс. Или используйте что-то уже встроенное для пары ключ-значение, например KeyValuePair.

person poindexter12    schedule 06.12.2010
comment
+1 - тогда он мог просто написать new KeyValuePair<int, string>(p.Id, p.Name) - person hunter; 06.12.2010
comment
Или даже оставьте <int, string> и позвольте компилятору вывести их. - person Matti Virkkunen; 06.12.2010

Если каждый из этих методов возвращает анонимный тип, который имеет те же поля, что и другие, вам нужно создать только один класс и повторно использовать его во всех методах.

Если каждый из них возвращает анонимный тип с разными полями, тогда да, вам придется создать класс для каждого из этих методов.

Если вы используете C # 4.0, вы можете попытаться воспользоваться преимуществами динамического типа и посмотрите, в какие проблемы вы можете попасть.

person Justin Niessner    schedule 06.12.2010

Что ж, вы, наверное, захотите вернуть periodsSettings.

Но после этого рассмотрите возможность перечисления коллекции с помощью ToDictionary() в этом методе, где ключ равен p.id, а значение равно p.name.

public static IDictionary<int, string> getSeaOf(string user) {
   return (from p in sea
           where p.add_by == new Guid(user))
          .ToDictionary(p => p.id, p => p.name);
}

Это эффективно дает вам ваши данные без необходимости создавать новый класс. Конечно, он перечисляет их здесь, но в вашем случае это может не иметь значения.

person Chris    schedule 06.12.2010