[英]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.