从单独的数据库中组合两个不同的DbContexts(LINQ)

时间:2016-06-13 22:20:31

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

我收到错误:

  

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

因为我试图组合两个不同的DbContexts,每个都来自不同的数据库。

我试图转换此 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

3 个答案:

答案 0 :(得分:1)

有几种方法可以实现这一目标。

我建议创建一个查询视图,然后将其绑定到一个新的linq对象,然后你可以查询它。试图在linq中完全编写你的查询是可能的,但是如果你正在处理多个数据上下文,它会变得很讨厌。

答案 1 :(得分:0)

您将不得不有两个不同的查询,实现查询结果,然后在内存中执行您想对它们执行的任何操作。

答案 2 :(得分:0)

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

我所做的是我在查询中使用了唯一的表,该表是另一个DbContext和另一个数据库(ORDERFORMDUMP)的一部分,我将该表复制到SQL Server中的主数据库。结果,我能够将该表添加到我的主DbContext