2017-08-16 23 views
0

我正在使用我的.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}"); 

好像这是不行的。

+0

我会尝试两件事。首先定义一个helpvariable并在其中捕获“_contextB.Database.GetDbConnection()。Database”;然后在.FromSql <>()语句中使用此帮助变量。如果这不起作用,我还会尝试将{1}和{0}的当前顺序更改为顺序顺序{0}和{1}。 – JRB

+0

我正在使用数据库名称的帮助变量,而且{0}和{1}的顺序是相反的。我只是复制第一个代码块并手动将其更改为第二个代码块,以突出显示更改并缩短问题。 – Stix

+0

你使用哪个版本的EF Core? – JRB

回答

0

由于问题是开放了一段时间,我交替使用“的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); 

不知怎的,第一方案是行不通的。似乎不值得为此付出更多努力。