我的数据表是由经过身份验证的用户编写的文章列表。
在索引页面上,我想显示文章列表以及每篇文章的作者的显示名称。 问题是 DisplayName 存储在我的应用程序 DBContext 标识表中,而我的数据存储在 DBContext(服务器上的单独数据库)中。 唯一的 USERID 键位于两个表上,iD 位于标识表上,作者 ID 位于数据表上。 我尝试了不同的tihngs,给出了不同的错误,最常见的是
"指定的 LINQ 表达式包含对与不同上下文关联的查询的引用">
生成该错误的代码如下所示:
var arts = (from a in db.Articles
join uid in iDdb.Users
on a.AuthorID equals uid.Id
select new ArticleVM
{
ID = a.ID,
ArticleTitle = a.ArticleTitle,
ArticleBody = a.ArticleBody.Substring(0, 200),
ArticleCategory = a.ArticleCategory,
DateCreated = a.DateCreated,
AuthorID = uid.DisplayName
}).AsEnumerable();
.db。数据数据库中的项目,IDdb.Users 是用户表(在身份数据库上)。 我可以编写一个 SQL 查询来生成我需要的东西,但是如何将这些数据放入 ViewModel,例如,这个 SQL 查询将提供我需要的东西:
var query = @"select artDB.*, usrDB.DisplayName from Article as artDB inner
join [IGTSIAppUsersTest1].dbo.AspNetUsers as usrDB on
artDB.AuthorID = usrDB.Id order by artDB.ID Desc";
var arts = db.Database.ExecuteSqlCommand(query);
谁能提出一种仍然有些有效的方法? 我找到了一种方法来使其工作,但它需要大量的代码并且确实损害了性能。
我找到了一种方法来做到这一点。 只要您只查看数据而不更改数据,它就可以工作。 我在这里找到了答案
string query = (@"select a.*, usr.DisplayName as 'DisplayName' from article a
join identitytablename.dbo.AspNetUsers usr on
datatable.Id = a.authorid");
IEnumerable<ArticleIndexVM> results = db.Database.SqlQuery<IndexViewModel>(query);
只要您的 ViemModel 类型和名称与查询表名称和类型的结果匹配,就可以正常工作
此处的方法之一是,您可以对用户和文章使用相同的上下文。如下链接所示。
对我的自定义实体和标识上下文使用相同的数据库?