- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在这里发布这个问题,因为我仍在 ServiceStack 客户论坛上等待批准。这是一个相当具体的问题,所以我不希望很多人能提供帮助...... @mythz :)
我正在将 ServiceStack 从 v5.4 迁移到 v5.7,在 SqlExpression
中存在别名问题.
我编写了一个自定义的 sql concat 以在一列中获得“kind-of-csv-format”,以便在使用联合时将数据合并到一列中。从 SQL 方面来看,简化版本为:
SELECT CONCAT(Col1, ',', Col2) as Data FROM Table1
UNION ALL
SELECT CONCAT(Col3, ',', Col4, ',', Col5) as Data FROM Table2
在 C# 中,使用 OrmLite api,我这样做:
var q1 = db.From<Table1>();
q1.Select(x => new
{
Data = Sql.Custom(q1.ConcatWithSeparator("@delimiter", y => new { y.Col1, y.Col2 }))
});
ConcatWithSeparator
是我的自定义方法,调用底层 IOrmLiteDialectProvider.SqlConcat()
在引擎盖下,在 @delimiter
之前插入匿名类型的成员之间。
这给了我: SELECT CONCAT("Table1"."Col1", @delimiter, "Table1"."Col2") AS DATA FROM "Table1"
这适用于 v5.4,但正如我注意到的,在 v5.7 中,方法 SqlExpression.SetAnonTypePropertyNamesForSelectExpression()
中引入了一个更改。( https://github.com/ServiceStack/ServiceStack.OrmLite/blob/v5.7/src/ServiceStack.OrmLite/Expressions/SqlExpression.cs )
if (arg is ConditionalExpression ce || // new { Alias = x.Value > 1 ? 1 : x.Value }
arg is BinaryExpression be || // new { Alias = x.First + " " + x.Last }
arg is MemberExpression me || // new { Alias = DateTime.UtcNow }
arg is ConstantExpression ct) // new { Alias = 1 }
{
IOrmLiteConverter converter;
var strExpr = !(expr is PartialSqlString) && (converter = DialectProvider.GetConverterBestMatch(expr.GetType())) != null
? converter.ToQuotedString(expr.GetType(), expr)
: expr.ToString();
return new PartialSqlString(strExpr + " AS " + member.Name);
}
特别是关于这张支票:
if (
...
arg is MemberExpression me || // new { Alias = DateTime.UtcNow }
...
)
new { x.Col1 }
的计算结果也为真,因为它是 new { Col1 = x.Col1 }
的缩写这进一步使sql语法Col1 as Col1
在我的 concat 中,它导致错误的 SQL SELECT CONCAT("Table1"."Col1" AS Col1, @delimiter, "Table1"."Col2" AS Col2) AS DATA FROM "Table1"
所以真正的问题是,是否应该进行额外检查,如果它是 MemberExpression me
, 还有 me.Member.Name != member.Name
?或者可能有一些额外的配置选项来绕过别名生成?
或者...有没有其他更容易实现的方法,我想做什么? (我必须支持 MySQL、MSSQL、Sqlite 和 PostgreSQL)。
更新,关于下面的@mythz 回答
不幸的是,它仍然没有按预期工作。但我认为,我们越来越近了。此处的转换器:
IOrmLiteConverter converter;
var strExpr = !(expr is PartialSqlString) && (converter = DialectProvider.GetConverterBestMatch(expr.GetType())) != null
? converter.ToQuotedString(expr.GetType(), expr)
: expr.ToString();
return new PartialSqlString(strExpr != member.Name
? strExpr + " AS " + member.Name
: strExpr);
将表达式计算为带引号的字符串,所以最后有一个检查 "\"Col1\"" != "Col1"
.
另外,我还写了一个版本ConcatWithSeparator<Table1, Table2>
可以将 lambda 作为 (t1, t2) => new { t1.Col1, t2.Col1 }
.在这种情况下,它会将成员表达式计算为类似于 "Table1"."Col1"
的内容。 (取决于 DBMS)- 我希望,多表版本不是一蹴而就的,它仍然可以在没有原始 sql 的情况下实现...
最佳答案
我已将其更改为当别名与 this commit 中的名称相同时不使用别名.
此更改适用于现在的最新 v5.7.1 available on MyGet .
关于c# - ServiceStack.OrmLite : using aliases in SqlExpression for anonymous types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58974112/
const example = () => new Promise((resolve) => { resolve(); console.log('1'); } ) example().
我正在尝试制作一个天气应用程序,并且我正在使用天气 API 来获取信息,但是当我尝试解析 JSON 数据时出现此错误: SyntaxError: Unexpected end of JSON inpu
我尝试编写一个函数来更改文本的颜色,但出现错误。我想知道如何解决这个问题。 function change() { var colour = prompt("What's your favourite
所以我对我正在处理的这段代码有疑问。我一直在使用在下面的链接中找到的聊天功能。当我将它集成到我的应用程序中使用时,它工作得很好,尽管我在修改它时遇到了麻烦。然而,为了为我的网站创建用户历史记录功能,我
我在 JSON.parse() 中出错,我有 .php 文件,其中包含从数据库检索数据的方法和 .js 文件,用于自动完成功能,我的 .php 文件以字符串形式返回数据,我需要将其转换为使用 JSON
在java中这是有效的 new Thread(new Runnable() { public void run() { for(in
该网站如何设法将引荐来源网址清空。所有其他引用者消隐服务似乎只是隐藏引用者。然而,这成功地让谷歌分析相信用户在网站中输入了内容。 我似乎无法弄清楚他们是如何做到的。 例如:http://www.ano
我正在查看这行代码 options?: { name?: string, async?: boolean }。 { name?: string, async?: boolean } 类型的正确术语是什
以下是 Javascript 考试的练习题和答案。 我很困惑,因为我最初的 react 是选择 B。我知道 D 也是正确的,但是当我参加定时考试时,如果我发现我认为是正确的答案,有时我会停止阅读其余的
当我遍历dom ..时,我在浏览器控制台日志中收到一条错误消息null at HTMLDivElement.。HTMLDivElement. 是什么意思? 浏览器 Google Chrome浏览器 图
这个问题已经有答案了: When should I use arrow functions in ECMAScript 6? (9 个回答) 已关闭 6 年前。 我已经看到了这两种类型的代码,我想知道
我创建了一项 WCF 服务并将其部署在服务器上。当我浏览此服务时,它会通过 ?wsdl URL 给出积极响应。现在我正在尝试通过 WCF 测试客户端测试该服务。它显示了正确的元数据。但是当我尝试从服务
如何阻止匿名用户在 gerrit 中查看我的项目事件。我已经用谷歌搜索了足够多的内容,但找不到所谓的项目访问控制列表的确切文件。 最佳答案 如果你想禁止匿名用户浏览/读取/搜索某个项目的所有变更,只需
就在今天,我需要一种在不同对象之间传递函数的方法。我很快了解到,你不能直接在 Java 中执行此操作,但你可以传递一个显然称为“匿名内部类”的实例,如下所示: 定义类: interface MyCal
留言簿的PHP代码如下: prepare('INSERT INTO comments(`author`, `comment`) VALUES(:author, :comment)'); $st
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
是否可以在不知道其类名的情况下将数据表转换为 ienumerable。 我的要求是转换表格 First | Last -------------- john | mcgill clara | lin
如何使用 Anonym 函数删除事件监听器,使用 removeEventListener(); document.getElementById("object").onclick = function
我在我的 Node 服务器上运行以下 psql: SELECT json_data.key AS id, json_data.value::int AS version FROM players.se
我想使用完整日历让用户创建工作日(周一至周日,如果可能的话,还有节假日)的开放时间。 fullcalendar 已经做了什么,但它不是针对特定的一周,所以它不应该有日期。那么问题来了: 有什么想法可以
我是一名优秀的程序员,十分优秀!