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

Но въпросът ми е, ако имам стотици функции като тази означава ли, че трябва да имам стотици класове?

Надявам се, че има по-общо решение, благодаря за помощта!!


Издание

Разглеждам

Silverlight - LinqToEntities - Как да върна анонимни типове

Но не мога да посоча името на класа в избраното ново, както прави статията?

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 с помощта на функционалността Generate From Usage на VS 2010.

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