как вернуть анонимный тип в linq-to-sql - PullRequest
6 голосов
/ 06 декабря 2010

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

 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 , что лучшим решением для этого случая является создание класса для возвращаемого типа.

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

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


Edition

Я смотрю на

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;
        }

Ответы [ 5 ]

3 голосов
/ 06 декабря 2010

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

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

3 голосов
/ 06 декабря 2010

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

2 голосов
/ 06 декабря 2010

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

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

2 голосов
/ 06 декабря 2010

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

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

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

0 голосов
/ 06 декабря 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);
}

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

...