2011-08-31 87 views
8

多個集合列,我想下面的SQL翻譯成LINQ:返回LINQ

SELECT 
    (Select count(BidID)) as TotalBidNum, 
    (Select sum(Amount)) as TotalBidVal 
FROM Bids 

我已經試過這樣:

from b in _dataContext.Bids 
select new { TotalBidVal = b.Sum(p => p.Amount), TotalBidNum = b.Count(p => p.BidId) } 

但得到一個錯誤「出價不包含定義爲「總和」,沒有擴展方法「總和」接受類型「投標」的第一個參數可以找到。

我該怎麼做LINQ?

感謝

,結論如下:

最終的答案是:

var ctx = _dataContext.Bids; 

var itemsBid = (from b in _dataContext.Bids 
       select new { TotalBidVal = ctx.Sum(p => p.Amount), TotalBidNum = ctx.Count() }).First(); 

回答

6

你可以試試這個了。變量b是一個實體(用於每次迭代),而ctx是一個具有所需擴展方法的實體集。

var ctx = _dataContext.Bids; 

var result = ctx.Select(x => new {TotalBidVal = ctx.Sum(p => p.Amount),TotalBidNum = ctx.Count(p => p.BidId)}).First(); 
+0

這確實解決了錯誤(儘管它似乎是不必要的步驟benfit - 這是爲什麼它需要?)。我的Count有一個問題(p => p.BidID) - p.BidID不是布爾值的錯誤。我用Count()替換它,現在查詢返回正確的總和和計數,但不是作爲單個行。一遍又一遍的同一行 - 我認爲很多次,因爲在投標表中有行。我怎樣才能返回像我原來的SQL查詢單行? – BKahuna

+0

@BKahuna你的查詢說「從_dataContext.Bids中的b」這是一個迭代。即使你只是計算總和和計數,你也不會得到一個結果。您可以通過調用First()來結束lambda表達式。這會給你只有一個結果,就像我所做的一樣。 – scartag

+0

@BKahuna請滾動我的答案到最後,看看我最後一次打電話。我調用First()方法,它將確保我只返回一行(生成的SQL是Top(1)) – scartag

1

這裏對scartag的解決方案替代:

(from b in _dataContext.Bids.Take(1) 
select new 
{ 
    TotalBidVal = _dataContext.Bids.Sum(p => p.Amount), 
    TotalBidNum = _dataContext.Bids.Count() 
}).Single(); 

雖然沒有你不能真正的原因只是說:

var result = new 
{ 
    TotalBidVal = _dataContext.Bids.Sum(p => p.Amount), 
    TotalBidNum = _dataContext.Bids.Count() 
}; 

它訪問數據庫的兩倍,但它的可讀性很強

+0

這也返回正確的答案 - 謝謝! – BKahuna

+0

我編輯了一個更實用的解決方案 – saus

17

您可以使用GroupBy來編寫此查詢。 lambda表達式如下:

var itemsBid = db.Bids 
        .GroupBy(i => 1) 
        .Select(g => new 
        { 
          TotalBidVal = g.Sum(item => item.Amount), 
          TotalBidNum = g.Count(item => item.BidId) 
        }); 
+1

正是我需要的(儘管在普通的舊LINQ中,沒有LINQ2SQL或EF)。 – jahu

+0

簡單。我喜歡。 – Oak

+0

這很簡單,但伎倆。順便說一下,我想知道運算符「.GroupBy(i => 1)」的用途。我們爲什麼需要這個? –

0

你可以把它用做Aggregate Clause

Aggregate t In _dataContext.Bids 
Into TotalBidNum = Count(BidID), 
    TotalBidVal = Sum(Amount) 

如果您使用FX4 +或FX2擴展DLL,你也可以從並行使用

Aggregate t In _dataContext.Bids.AsParallel