2016-12-07 105 views
0

我是新來LINQLAMBDA,並試圖做這樣的事情查詢:C#LINQ Lambda表達式選擇

SELECT p.*,o.QTYSUM FROM Database1..Table1 p 
    INNER JOIN (
    SELECT ISNULL(Sum(i.QTY),0) as QTYSUM,i.SKU 
    FROM Database2..Table2 i 
    WHERE i.LOCATION in ('Location1','Location2') 
    GROUP BY i.SKU) o on o.SKU=p.SKU 
    where o.QTYSUM>0 

我使用ASP.net核心 Web應用程序與.net核心框架。我已經聲明瞭dbContext,並且能夠分別單獨查詢兩個表。我只是無法弄清楚如何獲得加入的結果,並且每次嘗試時都會收到參數無例外

我已經做了幾次嘗試,無法讓它工作。

更新與我改掉的1來完成這個

from p in _DB1context.Table1 
join i in 
    (from i in _DB2context.Table2 
    where i.Location == "Location1" || i.Location == "Location2" 
    group i by i.SKU into mygroup 
    select new { 
      SKU = mygroup.First().SKU, 
      QtySum = mygroup.Sum(y => y.Qty) } 
) on p.SKU equals i.SKU 
where i.QtySum > 0 
select new { 
      pgroup = p, 
      SKU= p.SKU, 
      QtySum= i.QtySum 
      }; 

我儘快得到的錯誤,因爲我跑在這個ToList,我知道我可以解決這個問題通過創建一個存儲過程,做我的SQL,只是運行_context.table1.FromSql(「Exec my_Stored_Procedure」),但我真的想學習LINQ,一旦我知道我錯在哪裏,它會幫助我更好地理解這一點。 我也用_DB1context.Table1.Join(...)做了幾次嘗試,其中(...)。選擇(...)具有相同的結果。

+0

我們不是寫你的代碼你。你試過什麼了? – RandomStranger

+1

糾正,顯然是SO已經變成你的代碼寫作服務。 – RandomStranger

+0

你現在得到什麼錯誤?我可以看到的一件事是你可以使用'SKU = mygroup.Key'而不是'SKU = mygroup.First()。SKU'。我會注意到EF不會將跨上下文的連接轉換爲引用多個數據庫的SQL查詢。爲此,您需要一個存儲過程(或直接傳遞SQL查詢)。 –

回答

0

看一看在MSDN Article

他們舉一個例子用於內部連接,像這樣:

var innerJoinQuery = 
       from category in categories 
       join prod in products on category.ID equals prod.CategoryID 
       select new { ProductName = prod.Name, Category = category.Name }; //produces flat sequence 
+0

如果您仔細查看查詢,您會發現加入是在不同的數據庫上執行的。 –

+0

我從來沒有嘗試過它,但是因爲您使用dbContext查詢表的前綴,所以您應該能夠在查詢中使用多個數據庫。如果不是,則返回每個數據庫的結果並將結果集加入C#代碼中。 – meganaut