0

J'utilise mon application .NET Core pour interroger certaines données. Dans ma demande, j'utilise deux contextes différents. Comme LINQ/EF ne sont pas en mesure de se joindre entre deux contextes, je fais ma requête avec DbContext..FromSql:DbContext-FromSql ne peut pas remplacer le nom de base de données

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); 

Cette requête fonctionne comme un charme. Maintenant, je veux remplacer mon "Webservice" -database-nom dynamiquement de mon autre contexte.

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); 

La valeur _contextB.Database.GetDbConnection(). Base de données est la valeur exacte chaîne correcte. Mais la requête échoue toujours avec message d'erreur suivant:

"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 Syntaxe in der von Nähe." signifie "Mauvaise syntaxe proche de '.'."

Qu'est-ce qui est mal fait?


Mise à jour: L'exemple avant a été fait avec Core 1.1. Maintenant, j'ai mis à jour vers Core 2.0.

Cela fonctionne très bien:

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}"); 

Ce ne fonctionne pas:

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}"); 

On dirait que cela ne fonctionnera pas.

+0

Je voudrais essayer deux choses. Commencez par définir une variable d'aide et récupérez "_contextB.Database.GetDbConnection(). Database" dans le fichier; puis utilisez cette variable d'aide dans l'instruction .FromSql <>(). Si cela ne fonctionne pas, j'essaierais aussi de changer l'ordre actuel de {1} et {0} dans l'ordre séquentiel {0} et {1}. – JRB

+0

J'utilise une variable d'aide pour le nom de la base de données et l'ordre séquentiel de {0} et {1} est l'inverse. J'ai simplement copié le premier bloc de code et l'ai modifié manuellement pour le second bloc de code afin de mettre en évidence les changements et de raccourcir la question. – Stix

+0

Quelle version de EF Core utilisez-vous? – JRB

Répondre

0

La question est ouverte un certain temps, j'utilisé alternativement « String.Format » au lieu des noms de variables directement dans l'instruction 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); 

D'une certaine façon la première variante ne fonctionnait pas du tout. On dirait que ça ne vaut pas la peine de mettre plus d'efforts dans ce problème.