Laden...

dyn. LINQ (dynamische Spaltennamen in der WHERE-Klausel)

Erstellt von Froschkoenig84 vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.873 Views
F
Froschkoenig84 Themenstarter:in
63 Beiträge seit 2015
vor 8 Jahren
dyn. LINQ (dynamische Spaltennamen in der WHERE-Klausel)

verwendetes Datenbanksystem: <MSSQL>

Hallo, da übliche Problem: Ich brauche eine Abfrage und in WHERE soll eine des Spalten durch eine Variable ersetzt werden.

Ich habe das gefunden, aber es funktioniert nicht...
C# Linq Column Name as variable

Ich bekomme ein leeres Objekt zurück (siehe Anhang) und ich habe keine Ahnung wieso. Es muss doch möglich sein, eine simple, dynamische Abfrage zu bauen. Egal ob PHP, Ruby oder Python, alle anderen Sprachen machen da nicht so einen Hickhack draus, also wie kann ich diese Abfrage generieren, notfalls auch als pures SQL. 😕


public static List<ContentWithData> GetIdsWhere(FieldName, FieldValue)
{
    using (var Context = GetContext(true))
    {
        return (from Q in Context.event
            where
                Q.(FieldName) == FieldValue
            select new ContentWithData() { Id = Q.id }).Take(Limit).ToList();
    }
}

Ich weiß ja, dass ich neu in C# bin, aber sooo schwer kann das doch nicht sein, oder? 😕

16.807 Beiträge seit 2008
vor 8 Jahren

Das, was Du da machst, das ist ein ziemlicher Anti-Pattern.
Du weißt hier während der Entwicklung nicht, ob es das Feld wirklich gibt. Sowas macht man in einer streng typisierten Programmiersprache einfach nicht.
Das beweist also eher, wie anfällig sowas in anderen Sprachen umzusetzen ist. Das hat aber nichts mit einer sauberen Lösung zutun.

In .NET würde man a) die Struktur über den Repository Pattern (Entity Framework Generic Repository Pattern) umsetzen und dynamische Where-Clauses über Linq-Expressions.

Und bezogen auf den Repository Link wäre die Abfrage dann

FindAllBy<TEntity>(entity => entity.Id == "fieldValue");
F
Froschkoenig84 Themenstarter:in
63 Beiträge seit 2015
vor 8 Jahren

Hab jetzt einen anderen Ansatz gefunden, beides zu kombinieren. Vermutlich sagst du mir jetzt gleich, dass das unschicklich sei, aber hey, ich bin erst seit kurzer Zeit in C# (hatte zuvor 12 Jahre lang PHP entwickelt)... und ich muss dieses Projekt fertig stellen. 😉 Später sehe ich sicherlich ein, dass es unschön ist, aber jetzt erfüllt es erstmal seinen Zweck:

return (from Q in Context.events
    .Where(Filter.Terms.FirstOrDefault() + " == true")
    where Q.published
    && Q.image != null && Q.image != ""
    select new ContentWithData() { Title = Q.name_details, SeoSegment = Q.seo_segment, Image = Q.image, Summary = Q.summary_details, ... }).ToList().OrderBy(x => Guid.NewGuid()).Take(Limit).ToList();
W
955 Beiträge seit 2010
vor 8 Jahren
.OrderBy(x => Guid.NewGuid())  

Hi,
Wozu machst DU das? Willst DU die Zeilen zufällig durcheinanderwürfeln?

F
Froschkoenig84 Themenstarter:in
63 Beiträge seit 2015
vor 8 Jahren

Ja, diese sollen randomize-ordered ausgespruckt werden (bei mehr als 10 Mio Datensätzen ist das sinnvoll, da ich ja mit LIMIT beschränke)

S
417 Beiträge seit 2008
vor 8 Jahren

Hi,

da du vor deinem "Take(Limit)" schon ToList() aufrufst, liest du bereits alle Zeilen aus der DB und filterst dann erst im Speicher, was sicher nicht dein Ziel ist.

2.207 Beiträge seit 2011
vor 8 Jahren

Ich lehne mich mal weit aus dem Fenster jetzt und behaupte, dass, wenn du dich drei Stunden hinsetzt und mal ein LINQ-Tutorial durchliest, weiter kommst, als durch die rumprobiererei 😉

F
Froschkoenig84 Themenstarter:in
63 Beiträge seit 2015
vor 8 Jahren

Also ich hatte es zunächst auch ohne ToList() am Anfang versucht, aber das ging nicht, da sich das ".OrderBy(x => Guid.NewGuid())" nur auf eine Liste anwenden lässt. 😕

Und was das Tutorial betrifft... das mag sein, aber das "Herumprobieren" hat nur zwei Versuche je 5min benötigt. 😉 Hey, ich bin PHP'ler, wenn ich schon keine MixedVars hab, dann lass mir wenigstens mein Try&Catch!! 😛

16.807 Beiträge seit 2008
vor 8 Jahren

Der Anspruch eines Entwicklers kann doch nicht im ernst sein, dass es "irgendwie" geht, sondern dass man qualitativ hochwertigen Code schreibt? 🤔
Nen Metzger will doch auch hochwertiges und kein Gammelfleisch herstellen.

Also ich hatte es zunächst auch ohne ToList() am Anfang versuch

Auch hier verstehst Du vermutlich gar nicht, was ToList überhaupt macht und wieso ToList unfassbar giftig (und deplatziert) im DataAccessLayer ist...

Hey, ich bin PHP'ler, wenn ich schon keine MixedVars hab

Gut. Wir sind in .NET. Einer Erwachsenensprache.
Da setzt man eben Code erwachsen um und nicht wie in PHP oft "pi-mal-daumen" 😉
Wenn Du verstehst, was Dein Code macht, dann wirst Du daran viel viel mehr Spaß und Erfolg haben, als wenn Du versuchst PHP-"Stil" in .NET zu verwenden.