简体   繁体   English

通过 lambda 构建 sql 查询对象

[英]Build sql query object by lambda

Can anybody advise a lib to build a raw sql code by lambda expression?任何人都可以建议 lib 通过 lambda 表达式构建原始 sql 代码吗? Do not advise EF and Linq2sql because it doesn't provide a control over query.不要建议 EF 和 Linq2sql,因为它不提供对查询的控制。

Something like this.像这样的东西。 It's the code from my own library.这是我自己库中的代码。 But I don't wish to support this if there is another good solution for this case.但如果这种情况有另一个好的解决方案,我不希望支持这一点。

[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);
}

I've published the lib to GitHub with nuget package.我已使用 nuget 包将 lib 发布到 GitHub。 It contains basic scenarios and will be updated as necessary.它包含基本场景,并将根据需要进行更新。 Setting fields, where, group by, having, order by, joins, nested queries are already supported.已经支持设置字段,where、group by、has、order by、joins、嵌套查询。

https://github.com/Serg046/LambdaSql https://github.com/Serg046/LambdaSql

Example:示例:

var qry = new SqlSelect
(
    new SqlSelect<Person>()
        .AddFields(p => p.Id, p => p.Name)
        .Where(SqlFilter<Person>.From(p => p.Name).EqualTo("Sergey"))
    , new SqlAlias("inner")
).AddFields<Person>(p => p.Name);

Console.WriteLine(qry.ParametricSql);
Console.WriteLine("---");
Console.WriteLine(string.Join("; ", qry.Parameters
    .Select(p => $"Name = {p.ParameterName}, Value = {p.Value}")));

Output:输出:

SELECT
    inner.Name
FROM
(
    SELECT
        pe.Id, pe.Name
    FROM
        Person pe
    WHERE
        pe.Name = @w0
) AS inner
---
Name = @w0, Value = Sergey

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM