Reputation: 1412
I am getting the error:
The specified LINQ expression contains references to queries that are associated with different contexts.
because I'm trying to combine two different DbContexts, each from separate databases.
I was trying to convert this 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
to 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 };
Am I converting it correctly? Do I have to create two separate queries and combine them? Lastly, can I combine two different databases into one dbContext? If so, how do I do this?
Thank you.
UPDATE
I tried adding tables from another database into my main dbContext and I'm getting this error:
The entity type ORDERFORMDUMP is not part of the model for the current context.
UPDATE #2
What I did to solve my problem doesn't really answer this question, however it is a good workaround.
What I did was I took the only table in my query that was part of a different DbContext
and another database (ORDERFORMDUMP), and I copied that table to the main database in SQL Server. As a result, I was able to add that table to my main DbContext
.
Upvotes: 1
Views: 798
Reputation: 1412
What I did to solve my problem doesn't really answer this question, however it is a good workaround.
What I did was I took the only table in my query that was part of a different DbContext
and another database (ORDERFORMDUMP), and I copied that table to the main database in SQL Server. As a result, I was able to add that table to my main DbContext
.
Upvotes: 0
Reputation: 5689
There are a couple ways of accomplishing this.
I would recommending creating a view of your query, then bind it to a new linq object, and then you can query off of that. Trying to write your query fully in linq is possible, but it would just get nasty, given you are working with multiple data contexts.
Upvotes: 1
Reputation: 1279
You are going to have to have two different queries, materialize the query results, then do whatever operations you want to do on them in memory.
Upvotes: 0