209 Stimmen

Ergebnisse vom anonymen Typ zurückgeben?

Was ist die beste Methode, um mit Linq to SQL Ergebnisse aus mehreren Tabellen zurückzugeben, und zwar anhand des folgenden einfachen Beispiels?

Angenommen, ich habe zwei Tabellen:

Dogs:   Name, Age, BreedId
Breeds: BreedId, BreedName

Ich möchte alle Hunde mit ihren BreedName . Ich sollte alle Hunde mit so etwas ohne Probleme bekommen:

public IQueryable<Dog> GetDogs()
{
    var db = new DogDataContext(ConnectString);
    var result = from d in db.Dogs
                 join b in db.Breeds on d.BreedId equals b.BreedId
                 select d;
    return result;
}

Aber wenn ich Hunde mit Rassen will und das versuche, habe ich Probleme:

public IQueryable<Dog> GetDogsWithBreedNames()
{
    var db = new DogDataContext(ConnectString);
    var result = from d in db.Dogs
                 join b in db.Breeds on d.BreedId equals b.BreedId
                 select new
                        {
                            Name = d.Name,
                            BreedName = b.BreedName
                        };
    return result;
}

Jetzt erkenne ich, dass der Compiler nicht lassen Sie mich einen Satz von anonymen Typen zurückgeben, da es Dogs erwartet, aber gibt es eine Möglichkeit, dies zurückzugeben, ohne einen benutzerdefinierten Typ zu erstellen? Oder muss ich meine eigene Klasse für DogsWithBreedNames und geben Sie diesen Typ in der Select? Oder gibt es einen anderen, einfacheren Weg?

0 Stimmen

Nur so aus Neugier, warum zeigen alle Linq-Beispiele mit anonymen Typen, wenn sie nicht funktionieren. Z.B., dieses Beispiel tut foreach (var cust in query) Console.WriteLine("id = {0}, City = {1}", cust.CustomerID, cust.City);

0 Stimmen

@Hot Licks - die Tabelle Customer in diesen Beispielen ist eine Entität, die durch eine Klasse dargestellt wird. Das Beispiel scheint nur nicht die Definitionen dieser Klassen zu zeigen.

0 Stimmen

Sie erfahren auch nicht, dass ein Compilerfehler "var" durch den Klassennamen ersetzt.

0voto

Reader Man San Punkte 2079

Wenn die Hauptidee ist, um die SQL Select-Anweisung an den Datenbankserver gesendet haben nur die erforderlichen Felder, und nicht alle Entity-Felder, dann u kann dies tun:

public class Class1
{
    public IList<Car> getCarsByProjectionOnSmallNumberOfProperties()
    {

        try
        {
            //Get the SQL Context:
            CompanyPossessionsDAL.POCOContext.CompanyPossessionsContext dbContext 
                = new CompanyPossessionsDAL.POCOContext.CompanyPossessionsContext();

            //Specify the Context of your main entity e.g. Car:
            var oDBQuery = dbContext.Set<Car>();

            //Project on some of its fields, so the created select statment that is
            // sent to the database server, will have only the required fields By making a new anonymouse type
            var queryProjectedOnSmallSetOfProperties 
                = from x in oDBQuery
                    select new
                    {
                        x.carNo,
                        x.eName,
                        x.aName
                    };

            //Convert the anonymouse type back to the main entity e.g. Car
            var queryConvertAnonymousToOriginal 
                = from x in queryProjectedOnSmallSetOfProperties
                    select new Car
                    {
                        carNo = x.carNo,
                        eName = x.eName,
                        aName = x.aName
                    };

            //return the IList<Car> that is wanted
            var lst = queryConvertAnonymousToOriginal.ToList();
            return lst;

        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine(ex.ToString());
            throw;
        }
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X