如何连接来自两个不同数据库的两个表?

时间:2018-08-07 14:25:56

标签: c# sql sql-server entity-framework linq

我有这个LINQ查询,它在两个数据库(oContextoCommonContext)之间执行联接:

        Logs = from h in oContext.TbHistoryLog
               join o in oCommonContext.TbObjects on h.FormName equals o.ObjectRealName
               join u in oCommonContext.TbUsers on h.UserId equals u.UserId
               where userIds.Contains((Guid)h.UserId) && formNames.Contains(o.ObjectRealName)
               && h.DateUpdated > fromDate && h.DateUpdated < toDate
               orderby h.DateUpdated
               select new HistoryLog
               {
                   Id = h.Id,
                   ObjectId = h.ObjectId,
                   UserName = Helper.CurrLang == Helper.SystemLanguage.Arabic ? u.UserAName : u.UserEName,
                   UserCode = u.UserCode,
                   DateUpdated = h.DateUpdated,
                   ObjectCode = h.ObjectCode,
                   FormName = h.FormName,
                   ObjectName = Helper.CurrLang == Helper.SystemLanguage.Arabic ? o.ObjectAName : o.ObjectEName,
                   State = h.State
               };

        return Logs.ToList();

但是当我运行它时,它会引发错误:

  

指定的LINQ表达式包含对以下查询的引用:   与不同的上下文相关联。

我知道不允许在一个查询中引用两个数据库,

我尝试过这种解决方法:

    var histories = oContext.TbHistoryLog.ToList();

    Logs = from h in histories.AsQueryable()
           join o in oCommonContext.TbObjects on h.FormName equals o.ObjectRealName
           join u in oCommonContext.TbUsers on h.UserId equals u.UserId
           where userIds.Contains((Guid)h.UserId) && formNames.Contains(o.ObjectRealName)
           && h.DateUpdated > fromDate && h.DateUpdated < toDate
           orderby h.DateUpdated
           select new HistoryLog
           {
               Id = h.Id,
               ObjectId = h.ObjectId,
               UserName = Helper.CurrLang == Helper.SystemLanguage.Arabic ? u.UserAName : u.UserEName,
               UserCode = u.UserCode,
               DateUpdated = h.DateUpdated,
               ObjectCode = h.ObjectCode,
               FormName = h.FormName,
               ObjectName = Helper.CurrLang == Helper.SystemLanguage.Arabic ? o.ObjectAName : o.ObjectEName,
               State = h.State
           };

    return Logs.ToList();

并引发另一个异常:

  

此方法支持LINQ to Entities基础结构,但不支持   旨在直接从您的代码中使用。

当前看来,我在代码中没有选择,并且我认为最好在SQL中创建视图,但是问题在于数据库名称是未知的,并且它们根据客户端首选项而有所不同,因此,如果我创建了视图在第一个数据库中,我不知道第二个数据库的名称,反之亦然。

0 个答案:

没有答案