Как возвратить универсальный набор списка в C#?

У меня есть некоторый linq к sql методу и когда он делает запрос, он возвращает некоторый анонимный тип.

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

Я не знаю, как возвратить его все же.

Я думал, что мог сделать это

public List<T> thisIsAtest()
{
     return query;
}

но я получаю эту ошибку

Error   1   The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?)

Так не уверенный, какой блок я пропускаю или если это даже имеет место.

Спасибо

Править

Хорошо моя первая проблема была решена, но теперь у меня есть новая проблема, что я не уверен, как зафиксировать, так как я не знаю много об анонимных типах.

Я получаю эту ошибку

Не может неявно преобразовать тип 'Система. Наборы. Универсальный. Список' к 'Системе. Наборы. Универсальный. Список

Вот запрос

   DbContext.Table.Where(u => u.Table.UserId == userId && u.OutOFF != 0)
       .GroupBy(u => new { u.Table.Prefix })
       .Select(group => new { prefix = group.Key, 
                              Marks = group.Sum(item => (item.Mark * item.Weight) / item.OutOFF) })
       .ToList();

Редактирование 2

public class ReturnValue
{
   string prefix { get; set; }
   decimal? Marks { get; set; } 
}

public List<ReturnValue> MyTest(Guid userId)
{
   try
   {
       var result = dbContext.Table.Where(u => u.Table.UserId == userId && u.OutOFF != 0).GroupBy(u => new { u.Table.Prefix })
       .Select(group => new { prefix = group.Key, Marks = group.Sum(item => (item.Mark * item.Weight) / item.OutOFF) }).ToList();
       return result;
   }
   catch (SqlException)
   {
       throw;
   }

выбор имеет это в нем

Anonymous Types:

a is new{string Prefix}
b is new{ 'a prefix, decimal? marks}
5
задан marc_s 20 December 2009 в 23:05
поделиться

4 ответа

Вы не можете - точка. Вы не можете использовать анонимные типы за пределами их собственной области видимости, например, вы не можете возвращать их в качестве возвращаемых значений из метода.

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

Смотрите статью Рика Страла в блоге о поиске анонимных типов, и смотрите MSDN документы здесь , в которых ясно сказано:

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

OK, конечно - есть грязные ужасные взломы, чтобы действительно вернуть анонимные типы. Но если MSDN от Microsoft И Джон Скит отговаривает от такой практики, то - просто не делайте этого . По определению и намерению анонимные типы привязаны к методу, в котором они определены.

UPDATE для chobo2: Я не знаю, какие у вас типы данных - просто догадываюсь - но если предположить, что "префикс" - это int, а "знаки" - это десятичная цифра, то вы можете определить новый класс:

public class ReturnValue
{
    int prefix { get; set; }
    decimal Marks { get; set; } 
}  

и тогда ваш код будет методом, который возвращает List:

public List<ReturnValue> thisIsAtest()
{
   DbContext.Table.Where(u => u.Table.UserId == userId && u.OutOFF != 0)
     .GroupBy(u => new { u.Table.Prefix })
     .Select(group => new ReturnValue 
                          { prefix = group.Key, 
                            Marks = group
                              .Sum(item => (item.Mark * item.Weight) / item.OutOFF) })
     .ToList();
}

Ключ здесь: в вашем . Выберите метод , вместо того, чтобы создавать новый экземпляр анонимного типа:

     .Select(group => new { prefix = group.Key, marks = .... }

вы создаете экземпляр конкретного типа:

     .Select(group => new ReturnValue { prefix = group.Key, marks = .... }

Таким образом, у вас будет конкретный класс ReturnValue - имя, которое вам понравится - и тогда вы сможете легко вернуть список этого типа, а также использовать этот тип в другом месте.

.
8
ответ дан 18 December 2019 в 07:54
поделиться

Анонимные типы очень ограничены, вы можете использовать их только в рамках метода, если они объявлены.

Вы можете передать их обратно как обычные объекты, но тогда вы потеряете информацию о типе. Я видел некоторые решения, передающие анонимные типы; но они используют отражение для получения свойств позже.

0
ответ дан 18 December 2019 в 07:54
поделиться
public List<T> thisIsAtest<T>()
{
     return query;
}
9
ответ дан 18 December 2019 в 07:54
поделиться

Вы хотите вернуть анонимный тип из обычного метода? Я уверен, что можно с помощью Reflection, но не будет безопасности типов и множества других проблем. Не говоря уже о том, что это выглядит странно с точки зрения кодов вызова. Думаю, что в принципе придется возвращать объект.

Лучше использовать класс или структуру и набивать туда значения.

.
3
ответ дан 18 December 2019 в 07:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: