Dapper - Verbinden von List-Objekten

  • C#

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von ISliceUrPanties.

    Dapper - Verbinden von List-Objekten

    Ich hab mir mal überlegt, mich in Dapper zu versuchen.

    Dafür bin ich bei dapper-tutorils.net auf diese "Verfahrensweise" aufmerksam geworden und hätte nun die Frage, wie man die List-Objekte
    anhand von einer Bedingung "joinen" kann?

    Die Basis:

    C#-Quellcode

    1. class Program {
    2. public static List<string> strProtokoll = new List<string>();
    3. public class Artikel {
    4. public string Artikelnummer { get; set; }
    5. public string Bezeichnung { get; set; }
    6. public string Zusatz { get; set; }
    7. public double Listenpreis { get; set; }
    8. public string SSVerkauf { get; set; }
    9. public bool Inaktiv { get; set; }
    10. public string Lieferant { get; set; }
    11. }
    12. public class Aktionspreise {
    13. public string Artikelnummer { get; set; }
    14. public DateTime VonDatum { get; set; }
    15. public DateTime BisDatum { get; set; }
    16. public string Bemerkung { get; set; }
    17. public float Preis { get; set; }
    18. public ICollection<Artikel> AktionspreiseUndArtikel { get; set; }
    19. }
    20. static void Main(string[] args) { }


    Abhandlung:

    C#-Quellcode

    1. string sqlStatementArtikel = "select * FROM ART AS a INNER JOIN ARKALK AS ak ON a.Artikelnummer = ak.Artikelnummer ORDER BY a.Artikelnummer";
    2. string sqlStatementAktion = "SELECT * FROM ARPREIS WHERE BisDatum > GETDATE() AND BisDatum <= " + String.Concat("'",BisDate.ToShortDateString().ToString(), "'");
    3. var artikel = new List<Artikel>();
    4. var aktion = new List<Aktionspreise>();
    5. var lookup = new Dictionary<int, Artikel>();
    6. #if DEBUG
    7. Console.WriteLine(ConfigurationManager.ConnectionStrings["DEBUG"].ConnectionString);
    8. #endif
    9. using (WaDBconnection) {
    10. WaDBconnection.Open();
    11. artikel = (List<Artikel>)WaDBconnection.Query<Artikel>(sqlStatementArtikel);
    12. aktion = (List<Aktionspreise>)WaDBconnection.Query<Aktionspreise>(sqlStatementAktion);
    13. Console.WriteLine("Erfolg");
    14. }


    Wie bekomm ich nun die Collection "AktionspreiseUndArtikel" beim Füllen der Variablen aktion hin, in Abhängigkeit von der Artikelnummer?
    Ist jemand unter euch der Erfahrung hat mit Dapper und/oder Joinen von List<> mit Beziehung(en)??? :whistling:
    Hallo,
    ich habe mit Dapper (verwende eher Automapper) noch nicht gearbeitet, aber mit dieser Anleitung habe ich dein Vorhaben umsetzen können. Ich habe mir ein abgespecktes Datenmodell, welches an deins angelehnt ist, erstellt und bei meinem Test dieses Ergebnis bekommen.

    Quellcode

    1. ​1 - Artikel 1 - Prices:
    2. 16.02.2022 bis 28.02.2022: 5,00
    3. 01.03.2022 bis 15.03.2022: 10,00
    4. 2 - Artikel 2 - Prices:
    5. keine
    6. 3 - Artikel 3 - Prices:
    7. keine
    danke für deine Antwort @ISliceUrPanties

    ich hatte schon damit versucht also:

    C#-Quellcode

    1. var list = connection.Query<Order, OrderDetail, Order>(
    2. sql,
    3. (order, orderDetail) =>
    4. {
    5. Order orderEntry;
    6. if (!orderDictionary.TryGetValue(order.OrderID, out orderEntry))
    7. {
    8. orderEntry = order;
    9. orderEntry.OrderDetails = new List<OrderDetail>();
    10. orderDictionary.Add(orderEntry.OrderID, orderEntry);
    11. }
    12. orderEntry.OrderDetails.Add(orderDetail);
    13. return orderEntry;
    14. },
    15. splitOn: "OrderID")
    16. .Distinct()
    17. .ToList();
    18. Console.WriteLine(list.Count);
    19. FiddleHelper.WriteTable(list);
    20. FiddleHelper.WriteTable(list.First().OrderDetails);


    aber dabei wurde mir leider

    C#-Quellcode

    1. public ICollection<Artikel> AktionspreiseUndArtikel { get; set; }

    nicht gefüllt
    Naja, ich denke mal, du hast den Beispielcode an deine Bedürfnisse angepasst? Den solltest du mal posten, damit man dir besser helfen kann.
    Noch ein paar Hinweise:
    1. Die Eigenschaft AktionspreiseUndArtikel in deiner Klasse Aktionspreise gehört in die Artikelklasse.
    2. Die Eigenschaft sollte nur Aktionspreise heißen
    3. Die Klasse Aktionspreise sollte im Singular benannt werden
    4. Du musst deine beiden Tabellen per SQL mit JOIN verbinden, wenn du die Daten abfragst
    5. Die Eigenschaften in deinen Klassen müssen so heißen wie deine Spalten in den Tabellen
    6. Verwende niemals SELECT *, sondern gib die Spalten an, die du benötigst
    7. Debugge und setz einen Breakpoint innerhalb der anonymen Funktion, wenn Query aufgerufen wird. Dann bekommst du eine Idee, wo und wie deine Daten zu dir kommen.