Как вернуть анонимный тип из метода c#, использующего LINQ to SQL

Возможный дубликат: LINQ to SQL: Возврат анонимного типа?

У меня есть стандартный запрос LINQ to SQL, который возвращает данные в виде анонимного типа (содержащего около 6 столбцов данных различных типов).

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

Как я могу это сделать, учитывая, что это анонимный тип ("var")?

EDIT - Вот код:

    using (ormDataContext context = new ormDataContext(connStr))
    {
        var electionInfo = from t1 in context.elections
                   join t2 in context.election_status
                   on t1.statusID equals t2.statusID
                   select new { t1, t2 };
    }
Комментарии к вопросу (4)
Решение

Превратите анонимный тип в класс...

public class Person
{
    public Person() {
    }

    public String Name { get; set; }
    public DateTime DOB { get; set; }
}

Person p = 
    from person in db.People 
    where person.Id = 1 
    select new Person { 
        Name = person.Name,
        DOB = person.DateOfBirth
    }
Комментарии (8)

Ни один метод в C# не может быть явным типом анонимных типов. Они не могут быть "названы", так сказать, и, следовательно, не могут появляться в подписях метаданных.

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

  1. Пусть возвращаемый тип метода будет System.Object. Затем вы можете сделать злобный кастинг, чтобы получить типизированное значение в другом методе. Это очень хрупко, и я не рекомендую этого делать.
  2. Использовать общий метод и трюк с выводом типа, чтобы получить правильный возвращаемый тип. Это потребует очень интересного определения сигнатуры для вашего подхода.

Анонимные типы не предназначены для передачи таким образом. На том этапе, когда вам нужно передавать их между функциями таким образом, лучше явно определить тип.

Комментарии (2)

Используя ВАР не'т сделать это анонимный тип. Используя ВАР просто означает, пусть эта переменная будет типа доступны на правой стороне задания. Это's просто руки коротки. Если вещь на правую руку-это настоящий класс, переменная этого типа.

Например:

var person = new Person { Name = "bob" };

Человеку переменная имеет тип человек, даже если он используется ключевое слово var.

Анонимные типы создаются с помощью новых { имя = ... }. В этом случае он's новый, анонимный класс. Единственное, что вы можете присвоить его переменной, определенные с помощью VAR (или объекта), поскольку не существует имя.

Например:

var person = new { Name = "bob" };

В данном случае, это анонимный тип определяется во время выполнения.

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

Если вы вынуждены использовать анонимный тип, вы'придется передавать его обратно, как объект типа Object``, а затем использовать отражение, чтобы получить его's свойства.

Комментарии (4)

Jon Skeet написал блог о том, как это сделать, который совершенно справедливо озаглавлен Horribly Grotty Hack. Как следует из названия, вам не следует искать способы возврата анонимного типа. Вместо этого вам следует создать тип, который можно вернуть, поскольку это правильный способ реализации данной функции.

Поэтому я рекомендую вам создать конкретное определение возвращаемого типа, а затем ввести его в запрос, чтобы он был возвращен.

Комментарии (4)

Это зависит от того, как вызывающий код будет использовать эти данные.

Если вы делаете простой привязки данных, действительно Дон'т волнует типа (т. е. вы Don'т иметь, чтобы явно получить доступ к свойствам в своем коде C#), вы можете передать результаты обратно как IEnumberable.

В большинстве случаев привязки данных вы вызываете свойства по имени, через "Волшебные струны", в любом случае, точный тип не'т имеет значения, в любом случае.

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

Комментарии (0)

Если у вас есть, чтобы обойти результаты в большое приложение, вы можете использовать словарь и Л;строка,объект и GT;. Да у вас есть некоторые накладные расходы при забросе, но, по крайней мере, вы уменьшаете вы выбрасываете объекты.

Комментарии (0)