Domanda Come restituire il tipo anonimo dal metodo c # che usa LINQ a SQL [duplicato]


Possibile duplicato:
LINQ a SQL: restituire il tipo anonimo? 

Ho una query standard da LINQ a SQL, che restituisce i dati come un tipo anonimo (contenente circa 6 colonne di dati di vari tipi di dati).

Vorrei rendere questo oggetto restituito disponibile ad altre parti del programma, restituendolo al metodo-chiamante o assegnandolo a una proprietà dell'oggetto contenente il metodo.

Come posso fare questo dato che è un tipo anonimo ("var")?

EDIT - Ecco il codice:

    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 };
    }

44
2017-07-01 18:03


origine


risposte:


Rendi il tipo anonimo in una classe ...

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
    }

65
2017-07-01 18:07



Non è possibile digitare alcun metodo in C # come tipo esplicito di tipi anonimi. Non possono essere "nominati" per così dire e quindi non possono apparire nelle firme dei metadati.

Se vuoi davvero restituire un valore di tipo anonimo, ci sono 2 opzioni

  1. Avere il tipo di ritorno del metodo essere System.Object. È quindi possibile eseguire hack maliziosi per ottenere un valore digitato in un altro metodo. Questo è molto fragile e non lo consiglio
  2. Utilizzare un metodo generico e un tipo di trucco di inferenza per ottenere il tipo di ritorno corretto. Ciò richiederebbe una definizione di firma molto interessante per il tuo approccio.

I tipi anonimi non erano pensati per essere passati in questo modo. Nel punto in cui devi passare tra le tue funzioni in questo modo, è meglio definire un tipo in modo esplicito.


19
2017-07-01 18:10



L'uso di var non lo rende un tipo anonimo. L'uso di var significa semplicemente che questa variabile sia del tipo disponibile sul lato destro del compito. È solo una mano corta. Se la cosa sul lato destro è una vera classe, la variabile sarà di quel tipo.

Per esempio:

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

La variabile persona è di tipo Person, anche se ha usato la parola chiave var.

I tipi anonimi vengono creati usando new {Name = ...}. In questo caso è una nuova classe anonima. L'unica cosa a cui puoi assegnarlo è una variabile definita usando var (o oggetto) poiché non esiste un nome esistente da usare.

Per esempio:

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

In questo caso, la persona è un tipo anonimo definito in fase di esecuzione.

In generale, come dice @Chalkey, se si desidera passare il risultato a un altro metodo, utilizzare un tipo denominato, non anonimo.

Se sei costretto ad usare un tipo anonimo, dovrai restituirlo come oggetto di tipo Objectquindi usa la riflessione per ottenere le sue proprietà.


6
2017-07-01 18:19



Jon Skeet ha scritto un blog su come farlo, che è giustamente intitolato Hack terribilmente brutto. Proprio come suggerisce il titolo, non dovresti davvero cercare modi per restituire un tipo anonimo. Invece, dovresti creare un tipo che può essere restituito poiché questo è il modo corretto per implementare questa funzione.

Pertanto, ti consiglio di creare una definizione concreta del tipo da restituire e quindi inserire nella tua query che venga restituito.


5
2017-07-01 18:10



Dipende da come il codice chiamante utilizzerà i dati.

Se stai facendo un semplice bind di dati, non ti interessa davvero il tipo (cioè non devi accedere esplicitamente alle proprietà nel tuo codice C #), puoi restituire i risultati come IEnumberable.

Nella maggior parte dei casi di associazione dati si chiamano le proprietà per nome, tramite stringhe magiche, comunque, quindi il tipo esatto non importa comunque.

Altrimenti, è necessario convertire il tipo anonimo in un tipo con nome.


2
2017-07-01 19:20



Se devi passare in rassegna i risultati in un'app di grandi dimensioni, puoi utilizzare Dizionario. Sì, hai un sovraccarico durante il casting ma almeno stai riducendo gli oggetti buttati via.


0
2017-07-01 18:35