DbContext-FromSql不能代替数据库名称
问题描述:
我正在使用我的.NET Core应用程序来查询一些数据。在我的应用程序中,我使用了两种不同的上下文。由于LINQ/EF不能两个上下文之间的加入,我做我的查询与DbContext..FromSql:DbContext-FromSql不能代替数据库名称
IQueryable<Articles> query = _contextA.Articles.FromSql<Articles>(
@"SELECT a.*, ra.Barcode AS RequestedBarcode
FROM dbo.Articles a
INNER JOIN Webservice.dbo.RequestArticle ra
ON ra.ProducerId = a.ProducerId AND ra.Barcode = a.Barcode
WHERE ra.RequestId = {0}",
ArticleRequestGuid);
此查询的工作就像一个魅力。现在我想从我的其他上下文中动态替换我的“Webservice” - 数据库名称。
IQueryable<Articles> query = _contextA.Articles.FromSql<Articles>(
@"SELECT a.*, ra.Barcode AS RequestedBarcode
FROM dbo.Articles a
INNER JOIN {1}.dbo.RequestArticle ra
ON ra.ProducerId = a.ProducerId AND ra.Barcode = a.Barcode
WHERE ra.RequestId = {0}",
ArticleRequestGuid,
_contextB.Database.GetDbConnection().Database);
在_contextB.Database.GetDbConnection的值()。数据库是确切的正确的值串。但查询仍然失败,并显示以下错误消息:
"message": "Falsche Syntax in der Nähe von '.'.",
"detail": "
at System.Data.SqlClient.SqlCommand.<>c.<ExecuteDbDataReaderAsync>b__107_0(Task`1 result)\r\n
at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()\r\n
at System.Threading.Tasks.Task.Execute()\r\n
--- End of stack trace from previous location where exception was thrown ---\r\n
“Falsche Syntax in derNähevon'。'。”意思是“错误的语法接近'。'”。
什么是做错了?
更新: 以前的例子是用Core 1.1完成的。现在我已更新到Core 2.0。
这工作得很好:
IQueryable<Articles> query = _contextA.Articles.FromSql<Articles>(
@"SELECT a.*, ra.Barcode AS RequestedBarcode
FROM dbo.Articles a
INNER JOIN Webservice.dbo.RequestArticle ra
ON ra.ProducerId = a.ProducerId AND ra.Barcode = a.Barcode
WHERE ra.RequestId = {ArticleRequestGuid}");
这不是工作:
string webserviceDatabaseName = "Webservice";
IQueryable<Articles> query = _contextA.Articles.FromSql<Articles>(
@"SELECT a.*, ra.Barcode AS RequestedBarcode
FROM dbo.Articles a
INNER JOIN {webserviceDatabaseName}.dbo.RequestArticle ra
ON ra.ProducerId = a.ProducerId AND ra.Barcode = a.Barcode
WHERE ra.RequestId = {ArticleRequestGuid}");
好像这是不行的。
答
由于问题是开放了一段时间,我交替使用“的String.Format”,而不是可变的名字直接在SQL语句中:
string sqlQuery = String.Format(
@"SELECT a.*, ra.Barcode AS RequestedBarcode
FROM dbo.Articles a
INNER JOIN {0}.dbo.RequestArticle ra
ON ra.ProducerId = a.ProducerId AND ra.Barcode = a.Barcode
WHERE ra.RequestId = '{1}'",
_contextB.Database.GetDbConnection().Database,
ArticleRequestGuid
);
var query = _contextA.Articles.FromSql<Articles>(sqlQuery);
不知怎的,第一方案是行不通的。似乎不值得为此付出更多努力。
我会尝试两件事。首先定义一个helpvariable并在其中捕获“_contextB.Database.GetDbConnection()。Database”;然后在.FromSql ()语句中使用此帮助变量。如果这不起作用,我还会尝试将{1}和{0}的当前顺序更改为顺序顺序{0}和{1}。 – JRB
我正在使用数据库名称的帮助变量,而且{0}和{1}的顺序是相反的。我只是复制第一个代码块并手动将其更改为第二个代码块,以突出显示更改并缩短问题。 – Stix
你使用哪个版本的EF Core? – JRB