У меня есть некоторый 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}
Вы не можете - точка. Вы не можете использовать анонимные типы за пределами их собственной области видимости, например, вы не можете возвращать их в качестве возвращаемых значений из метода.
Если вам нужно вернуть их, вам нужно определить новый конкретный класс вместо анонимного, и использовать его вместо анонимного типа.
Смотрите статью Рика Страла в блоге о поиске анонимных типов, и смотрите 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
- имя, которое вам понравится - и тогда вы сможете легко вернуть список этого типа, а также использовать этот тип в другом месте.
Анонимные типы очень ограничены, вы можете использовать их только в рамках метода, если они объявлены.
Вы можете передать их обратно как обычные объекты, но тогда вы потеряете информацию о типе. Я видел некоторые решения, передающие анонимные типы; но они используют отражение для получения свойств позже.
Вы хотите вернуть анонимный тип из обычного метода? Я уверен, что можно с помощью Reflection, но не будет безопасности типов и множества других проблем. Не говоря уже о том, что это выглядит странно с точки зрения кодов вызова. Думаю, что в принципе придется возвращать объект.
Лучше использовать класс или структуру и набивать туда значения.
.