我有这样的观点:
CREATE VIEW MyView AS
SELECT Column FROM Table WHERE Value = 2;
Run Code Online (Sandbox Code Playgroud)
我想让它更通用,它意味着将2变为变量.我试过这个:
CREATE VIEW MyView AS
SELECT Column FROM Table WHERE Value = @MyVariable;
Run Code Online (Sandbox Code Playgroud)
但MySQL不允许这样做.
我找到了一个丑陋的解决方法:
CREATE FUNCTION GetMyVariable() RETURNS INTEGER DETERMINISTIC NO SQL
BEGIN RETURN @MyVariable; END|
Run Code Online (Sandbox Code Playgroud)
然后观点是:
CREATE VIEW MyView AS
SELECT Column FROM Table WHERE Value = GetMyVariable();
Run Code Online (Sandbox Code Playgroud)
但它看起来很糟糕,而且用法也很糟糕 - 我必须在每次使用视图之前设置@MyVariable.
有没有解决方案,我可以像这样使用:
SELECT Column FROM MyView(2) WHERE (...)
Run Code Online (Sandbox Code Playgroud)
具体情况如下:我有一个表存储有关被拒绝请求的信息:
CREATE TABLE Denial
(
Id INTEGER UNSIGNED AUTO_INCREMENT,
PRIMARY KEY(Id),
DateTime DATETIME NOT NULL,
FeatureId MEDIUMINT …Run Code Online (Sandbox Code Playgroud) 有一个简单的Linq到EF:
var query = from p in _db.Posts
where p.BlogtId == blogId
select p;
Run Code Online (Sandbox Code Playgroud)
它以这种形式生成SQL:
SELECT
`Extent1`.`PostId`,
`Extent1`.`BlogId`,
...
FROM `Posts` AS `Extent1`
WHERE `Extent1`.`BlogId` = @p__linq__0
Run Code Online (Sandbox Code Playgroud)
但是当我向此查询添加订单时
var query = from p in _db.Posts
where p.BlogId == blogId
orderby p.PublishDate
select p;
Run Code Online (Sandbox Code Playgroud)
它会生成此查询
SELECT
`Project1`.`PostId`,
`Project1`.`BlogId`,
...
FROM (SELECT
`Extent1`.`PostId`,
`Extent1`.`BlogId`,
...
FROM `Posts` AS `Extent1`
WHERE `Extent1`.`BlogId` = @p__linq__0) AS `Project1`
ORDER BY
`Project1`.`PublishDate` ASC
Run Code Online (Sandbox Code Playgroud)
为什么会生成子查询?MySQL中的此查询存在性能问题.MySQL正在尝试执行内部查询,该查询将数据库中的所有记录拉回,然后尝试对主题进行排序.
我需要一个解决方案来生成linq下面的sql
SELECT
`Extent1`.`PostId`,
...
FROM `Posts` AS `Extent1`
WHERE `Extent1`.`BlogId` = @p__linq__0 …Run Code Online (Sandbox Code Playgroud)