【问题标题】:Combining Two Different DbContexts (LINQ) from Separate Databases组合来自不同数据库的两个不同 DbContext (LINQ)
【发布时间】:2016-06-15 02:26:23
【问题描述】:

我收到错误:

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

因为我正在尝试组合两个不同的 DbContext,每个都来自不同的数据库。

我试图转换这个 SQL

SELECT orderformdump.itemno,basedescription,info,upc,CAST(UNITPRICE AS DECIMAL(18,2)),caseqty, sum(qty) AS userquantity
FROM [DataWarehouse].[dbo].[ORDERFORMDUMP] 
LEFT JOIN PPPLTD.dbo.ICPRICP ON replace([DataWarehouse].[dbo].[ORDERFORMDUMP].[ITEMNO],'-','') = ICPRICP.ITEMNO
LEFT JOIN PPPLTD.dbo.WEBITEMINFO ON ORDERFORMDUMP.ITEMNO = WEBITEMINFO.ITEMNO
LEFT JOIN pppltd.dbo.weboeordh ON [user] = @username
LEFT JOIN pppltd.dbo.weboeordd ON pppltd.dbo.WEBOEORDD.ITEMNO = REPLACE(datawarehouse.dbo.ORDERFORMDUMP.ITEMNO,'-','') and weboeordd.ORDUNIQ = weboeordh.orduniq
Left JOIN pppltd.dbo.weboeordsubmit ON weboeordsubmit.orduniq = weboeordd.ORDUNIQ and weboeordd.ORDUNIQ != weboeordsubmit.orduniq
LEFT JOIN PPPLTD.dbo.WEBLOGINACCESS ON WEBLOGINACCESS.[USER] = @username
LEFT JOIN PPPLTD.dbo.ARCUS ON ARCUS.IDCUST = WEBLOGINACCESS.CUSTID
where (allowinbc = 'Yes' or allowinab = 'Yes') 
AND [PRICELIST] = ARCUS.PRICLIST 
and [CURRENCY] = 'CDN' and DPRICETYPE = 1
and (itemgroup like '%' + @search + '%' or itemtype like '%' + @search + '%' or itembrand like '%' + @search + '%' 
or subcat  like '%' + @search + '%' or orderformdump.description  like '%' + @search + '%' or basedescription like '%'+ @search + '%' 
or orderformdump.ITEMNO like '%'+@search+'%' or UPC like '%'+@search+'%' or (select top 1 1 from pppltd.dbo.ICITEMO where OPTFIELD like 'UPC%' and VALUE like '%'+@search+'%' 
and ITEMNO = DataWarehouse.dbo.ORDERFORMDUMP.itemno) is not null) 
group by ORDERFORMDUMP.ITEMNO,BASEDESCRIPTION,info,UPC,CAST(UNITPRICE AS DECIMAL(18,2)),caseqty
order by basedescription

到 LINQ

        var qty = db.WebOEOrdD.Sum(d => d.QTY);
        var unitPrice = db.IcPricP.Select(p => decimal.Round(p.UNITPRICE, 2));

        var query = from item in dbData.OrderFormDump
                    join icp in db.IcPricP on item.ITEMNO.Replace("-", "") equals icp.ITEMNO
                    join itemInfo in db.WebItemInfo on item.ITEMNO equals itemInfo.ITEMNO
                    join weboeordh in db.WebOEOrdH on username equals weboeordh.USER
                    join weboeordd in db.WebOEOrdD on new { itemno = item.ITEMNO.Replace("-", ""), orduniq = weboeordh.ORDUNIQ } equals new { itemno = weboeordd.ITEMNO, orduniq = weboeordd.ORDUNIQ }
                    join weboeordsubmit in db.WebOEOrdSubmit on weboeordd.ORDUNIQ equals weboeordsubmit.ORDUNIQ where weboeordsubmit.ORDUNIQ != weboeordd.ORDUNIQ
                    join webloginaccess in db.WebLoginAccess on username equals  webloginaccess.USER
                    join arcus in db.Arcus on webloginaccess.CUSTID equals arcus.IDCUST
                    where (item.ALLOWINBC == "Yes" && item.ALLOWINAB == "Yes")
                    && icp.PRICELIST == arcus.PRICLIST
                    && icp.CURRENCY == "CDN" && icp.DPRICETYPE == 1
                    && (item.BASEDESCRIPTION.Contains(searchword) || item.DESCRIPTION.Contains(searchword) || item.CATEGORY.Contains(searchword) || item.FOODACCSPEC.Contains(searchword) || item.ITEMBRAND.Contains(searchword) || item.ITEMGROUP.Contains(searchword) || item.ITEMNO.Contains(searchword) || item.ITEMSUBTYPE.Contains(searchword) || item.ITEMTYPE.Contains(searchword) || itemInfo.INFO.Contains(searchword) || item.UPC.Contains(searchword) || item.UPC.Substring(2, 10).Contains(searchword))
                    orderby item.BASEDESCRIPTION
                    group item by new { item.ITEMNO, item.BASEDESCRIPTION, itemInfo.INFO, item.UPC, unitPrice, item.CASEQTY, qty } into items
                    select new { items.Key.ITEMNO, items.Key.BASEDESCRIPTION, items.Key.INFO, items.Key.UPC, unitPrice, items.Key.CASEQTY, qty };

我是否正确转换它?我是否必须创建两个单独的查询并将它们组合起来?最后,我可以将两个不同的数据库合并到一个 dbContext 中吗?如果是这样,我该怎么做?

谢谢。

更新

我尝试将另一个数据库中的表添加到我的主 dbContext 中,但出现此错误:

实体类型 ORDERFORMDUMP 不是当前上下文模型的一部分。

更新 #2

我为解决问题所做的工作并不能真正回答这个问题,但这是一个很好的解决方法。

我所做的是,我在查询中获取了属于不同 DbContext 和另一个数据库 (ORDERFORMDUMP) 的唯一表,并将该表复制到 SQL Server 中的主数据库。结果,我能够将该表添加到我的主要DbContext

【问题讨论】:

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


    【解决方案1】:

    有几种方法可以做到这一点。

    我建议您创建一个查询视图,然后将其绑定到一个新的 linq 对象,然后您就可以从中查询。尝试在 linq 中完全编写查询是可能的,但考虑到您正在使用多个数据上下文,它只会变得令人讨厌。

    【讨论】:

      【解决方案2】:

      您将必须有两个不同的查询,具体化查询结果,然后在内存中对它们执行任何操作。

      【讨论】:

        【解决方案3】:

        我为解决问题所做的工作并不能真正回答这个问题,但这是一个很好的解决方法。

        我所做的是,我在查询中获取了属于不同 DbContext 和另一个数据库 (ORDERFORMDUMP) 的唯一表,然后将该表复制到 SQL Server 中的主数据库中。结果,我能够将该表添加到我的主要DbContext

        【讨论】:

        • 您现在不需要设置集成以按预定时间间隔运行吗?似乎过于复杂
        猜你喜欢
        • 1970-01-01
        • 2013-07-30
        • 1970-01-01
        • 2012-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多