Вопрос по c#, linq, linq-to-sql – Как вернуть анонимный тип из метода c #, который использует LINQ to SQL [duplicate]

44

Possible Duplicate:
LINQ to SQL: Return anonymous type?

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

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

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

РЕДАКТИРОВАТЬ - вот код:

    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 };
    }
В C # 7 вы можете использовать кортежи ... см .:stackoverflow.com/a/43087096/193634 Rosdi Kasim
Что такое поля t1, t2? user110714
Оставляя это как след от крошки на данный момент. Оставьте комментарий, если считаете, что эти два вопроса должны быть объединены, и я проверю позже. Bill the Lizard
Просто чтобы внести ясность,var не является анонимным типомvar это сокращенное ключевое слово, которое вы можете использовать при условии, что компилятор может определить тип. В этом случае,electionInfo это анонимный тип. Johnathon Sullinger

Ваш Ответ

6   ответов
65

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
    }
Error: User Rate Limit Exceeded alchemical
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded alchemical
5

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

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded alchemical
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded alchemical
0

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

2

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

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

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

19

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

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

Have the return type of the method be System.Object. You can then do evil casting hacks to get a typed value in another method. This is very fragile and I don't recommend it. Use a generic method and a type inference trick to get the return type correct. This would require a very interesting signature definition for your approach.

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

At the point you need to pass them around between your functions in this manner, you're better off explicitly defining a type Obviously you're not a (JavaScript) golfer. ;^)
Error: User Rate Limit Exceeded
6

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

Например:

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

Переменная person имеет тип Person, хотя она использовала ключевое слово var.

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

Например:

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

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

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

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

@NagaMensch -- I would go the route suggested by @Chalkey and create a separate model/class for the join and not use an anonymous type here.<,/span> – tvanfosson Jul 1 '09 at 20:05
Error: User Rate Limit Exceeded alchemical
Error: User Rate Limit Exceeded alchemical
Error: User Rate Limit Exceeded

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