2016-05-29 3 views
0

Jeder kann eine lib raten, einen rohen SQL-Code durch Lambda-Ausdruck zu erstellen? Empfehlen Sie EF und Linq2sql nicht, da es keine Kontrolle über die Abfrage bietet.Build sql Abfrageobjekt von Lambda

Alles dergleichen. Es ist der Code aus meiner eigenen Bibliothek. Aber ich möchte das nicht unterstützen, wenn es eine andere gute Lösung für diesen Fall gibt.

[Fact] 
public void TotalTest() 
{ 
    var countFld = SqlField<Person>.Count(p => p.LastName); 
    var select = new SqlSelect<Person>() 
     .AddFields(p => p.LastName, p => p.Name) 
     .AddFields<Passport>(p => p.Number) 
     .AddField(countFld) 
     .InnerJoin<Person, Passport>((person, passport) => person.Id == passport.PersonId) 
     .Where(SqlFilter<Passport>.From(p => p.Number).IsNotNull().And(p => p.Number).NotEqualTo("3812-808316")) 
     .GroupBy(p => p.LastName) 
     .Having(SqlFilter<Person>.From<int>(countFld).GreaterThan(2)) 
     .OrderBy(p => p.LastName); 

    var expected = 
@"SELECT 
    pe.LastName, pe.Name, pa.Number, COUNT(pe.LastName) 
FROM 
    Person pe 
INNER JOIN 
    Passport pa ON pe.Id = pa.PersonId 
WHERE 
    pa.Number IS NOT NULL AND pa.Number <> '3812-808316' 
GROUP BY 
    pe.LastName 
HAVING 
    COUNT(pe.LastName) > 2 
ORDER BY 
    pe.LastName"; 
    Assert.Equal(expected, select.CommandText); 
} 
+0

Haben Sie Entity Framework in Betracht gezogen? Oder brauchst du eigentlich * die SQL-Ausgabe? – Bobson

+0

Ich benutze Dapper, ich brauche rohe SQL. Und EF manchmal generieren eine sehr komplexe Abfrage und es bietet keine Kontrolle über die Abfrage Ich mag nicht EF und seine QueryProvider – Serg046

+0

Wenn Sie Abfragen erstellen dieses Handbuch, was ist das Lambda tatsächlich für Sie hinzufügen? Warum nicht einfach den TSQL direkt codieren? Wenigstens dann wirst du wissen, was du machst ... –

Antwort