26 Stimmen

Wie man alle Eltern-/Kind-Daten in einem komplexen Objekt zurückholt

Ich habe diese beiden Tabellen mit einer Eins-zu-Viele-Beziehung (Kategorie zu Produkt) in der Datenbank:

Tabelle Produkt
    Name
    Beschreibung
    Produktkategorie

Tabelle Kategorie
    Kategorie
    Beschreibung

Und diese Klassen:

public class Produkt
{
    public string Name { get; set; }
    public string Beschreibung { get; set; }
    public Kategorie KategorieName { get; set; }    
}

public class Kategorie
{
    public string KategorieName { get; set; }
    public string Beschreibung { get; set; }    
}

Ich möchte eine Liste mit allen Produkt- und Kategorieobjektdaten zurückbekommen.

Ich habe von multipleResults und queryMultiple gelesen, weiß aber nicht, wie man sie verknüpft.

I know how to do it for a single product but what about all products with their individual category objects as well.

30voto

Shyju Punkte 205236

Angenommen, Sie haben Ihre Tabellen so.

Produkt

ID
Produktname
Produktkategorie-ID

Kategorie

ID
Kategoriename

und Ihre Klassen

public class Product
{
    public int ID { set; get; }
    public string ProductName { set; get; }
    public int ProductCategoryID  {set;get;}
    public Category Category { set; get; }
}
public class Category
{
    public int ID { set; get; }
    public string CategoryName { set; get; }
}

Der unten stehende Code sollte gut funktionieren, um eine Liste von Produkten mit zugehörigen Kategorien zu laden.

var conString="Ersetzen Sie hier Ihre Verbindungszeichenfolge";
using (var conn = new SqlConnection(conString))
{
    conn.Open();
    string qry = "SELECT P.ID,P.ProductName,P.ProductCategoryID,C.ID,
                  C.CategoryName from Product P  INNER JOIN   
                  Category C ON P.ProductCategoryID=C.ID";
    var products = conn.Query
                     (qry, (prod, cat) => { prod.Category = cat; return prod; });

    foreach (Product product in products)
    {
        //jetzt etwas mit den Produkten machen, wie Sie möchten.
    }
    conn.Close(); 
}

Bildbeschreibung hier eingeben Hinweis : Dapper geht davon aus, dass Ihre ID-Spalten "Id" oder "id" heißen, wenn Ihr Primärschlüssel anders ist oder Sie die breite Zeile an einer anderen Stelle als "Id" aufteilen möchten, verwenden Sie den optionalen Parameter 'splitOn'.

8voto

Mauro Cerutti Punkte 684

Dies sollte tun, was Sie wünschen:

var res = db.Query(
  @"select p.[Name], p.[Description], c.Category, c.Category as [CategoryName], c.Description
  from Product p
  inner join Category c on c.Category = p.ProductCategory",
  (prd, cat) => {
      prd.CategoryName = cat;
      return prd;
  },
  splitOn: "Category"
  ).AsQueryable();

Außerdem ist der Name CategoryName, den Sie für eine der Eigenschaften von Product gewählt haben, unpraktisch.

Ich schlage vor, dass Sie Ihre Product-Klasse wie folgt ändern:

public class Product
{
   public string Name { get; set; }
   public string Description { get; set; }
   public Category Category { get; set; }    
}

Dann kann die Abfrage sauberer werden:

var res = db.Query(
    @"select p.[Name], p.[Description], c.Category as [CategoryName], c.Description
      from Product p
      inner join Category c on c.Category = p.ProductCategory",
      (prd, cat) => {
          prd.Category = cat;
          return prd;
      },
      splitOn: "CategoryName"
      ).AsQueryable();

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