Domanda

  

Eventuali duplicati:
   LINQ to SQL:? Rientro tipo anonimo

Ho un LINQ standard per query SQL, che restituisce i dati come un tipo anonimo (che contiene circa 6 colonne di dati di vari tipi di dati).

Vorrei rendere questo oggetto restituito a disposizione delle altre parti del programma, sia con il ritorno al metodo-chiamante, o assegnandolo ad una proprietà dell'oggetto contenente il metodo.

Come posso fare questo dato che si tratta di un tipo anonimo ( "var")?

Modifica - 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 };
    }
È stato utile?

Soluzione

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

Altri suggerimenti

Non è possibile digitare qualsiasi metodo in C # per essere il tipo esplicito di un tipi anonimi. Non possono essere "chiamati" per così dire, e quindi non può apparire nelle firme dei metadati.

Se davvero si vuole restituire un valore che è un tipo anonimo ci sono 2 opzioni

  1. hanno il tipo di ritorno del metodo sia System.Object. È quindi possibile fare hack acciai male per ottenere un valore digitato in un altro metodo. Questo è molto fragile e io non lo consiglio.
  2. Usa un metodo generico e un trucco inferenza di tipo per ottenere il tipo di ritorno corretto. Ciò richiederebbe una definizione firma molto interessante per il vostro approccio.

tipi anonimi non sono stati in realtà destinate ad essere passati in giro in questo modo. Nel punto è necessario passare in giro tra le funzioni in questo modo, è meglio definire esplicitamente un tipo.

Utilizzando var non lo rende un tipo anonimo. Utilizzando var significa lasciare che questa variabile sia del tipo disponibile sul lato destro della cessione. E 'solo mano breve. Se la cosa sul lato destro è una vera classe, la variabile sarà di quel tipo.

Ad esempio:

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

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

tipi anonimi sono creati utilizzando new {Name = ...}. In questo caso si tratta di una nuova classe, anonima. L'unica cosa che è possibile assegnare ad una variabile definita utilizzando var (o oggetto) in quanto non v'è alcun nome esistente da utilizzare.

Ad 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 vuole passare il risultato a un altro metodo, utilizzare un tipo di nome, non un anonimo.

Se si è costretti a utilizzare un tipo anonimo, si dovrà passare di nuovo come un oggetto di tipo Object, quindi utilizzare la riflessione per arrivare a sue proprietà.

Jon Skeet ha scritto un blog su come fare questo, che è giustamente intitolato Horribly Grotty Hack . Proprio come suggerisce il titolo, davvero non dovrebbe essere alla ricerca di modi per restituire un tipo anonimo. Invece, si dovrebbe essere la creazione di un tipo che può essere restituito in quanto questo è il modo corretto per implementare questa funzione.

Quindi, vi consiglio di creare una definizione concreta del tipo da restituire e quindi popolare che nella query per essere restituito.

E 'sorta di dipende da come il codice chiamante sta per utilizzare i dati.

Se si sta facendo semplici dati vincolanti, sono in realtà non si preoccupano del tipo (ad esempio non si dispone di accesso in modo esplicito le proprietà nel codice C #), è possibile passare i risultati indietro come IEnumberable.

Nella maggior parte dei casi di associazione dati che si sta chiamando per nome le proprietà, tramite corde magiche, in ogni caso, in modo che il tipo esatto non importa in ogni caso.

In caso contrario, è necessario convertire il tipo anonimo a un tipo di nome.

Se si deve passare intorno i risultati in una grande applicazione è possibile utilizzare il dizionario. Sì avete un certo overhead in fase di lancio, ma almeno si stanno riducendo buttare via gli oggetti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top