2011-06-22 65 views
1

我有我試圖轉換爲LINQ到實體,但正確的解決方案是目前影射我下面的SQL語句:需要幫助通過將SQL語句組,總結成LINQ到實體

select op.orders_products_id, 
     op.products_id, 
     op.products_model, 
     op.products_name, 
     op.products_price, 
     sum(op.products_quantity) as quantity, 
     sum(op.count_quantity) as count_quantity 
from orders_products op 
where orders_id = 574214 
group by op.products_id 
order by op.products_model, op.orders_products_id 

在這個特定的SQL語句中,orders_products_id是表的主鍵,因此當我們按products_id值進行分組時,它將摺疊表中相同product_id的所有重複行,並且數量列結果將爲總數數量爲所有列。給定訂單聲明,op.orders_products_id應該最終成爲每個在同一個表中具有多個條目的特定產品的第一行ID。

要選擇使用LINQ到實體的線沒有做的分組,我會用下面的代碼:

using (var uow = new StoreEntities()) { 
    var query = from op in uow.OrderProducts 
       where op.OrderID == 574214 
       orderby op.Model, op.OrderProductID 
       select new { 
        ID = op.OrderProductID, 
        ProductID = op.ProductID, 
        Model = op.Model, 
        Name = op.Name, 
        SalePrice = op.SalePrice, 
        Qty = op.Qty, 
        CountedQty = op.CountedQty, 
       }; 
    var list = query.ToList(); 
} 

但我完全此刻失去了,我怎麼會去這樣做分組到獲得與我原來的SQL相同的結果?當我將LINQ分組到實體中時,分組的結果是一個帶有密鑰的新序列和該密鑰項目的詳細信息。我該如何將這種情況弄平,以便我可以將結果類似於我編寫原始SQL查詢的結果?

回答

1

如果你不想使用聚合功能上未分組屬性,你將需要任意選擇一排,在這個例子中我使用了FirstOrDefault()方法

var query = (from op in uow.OrderProducts 
      where op.OrderID == 574214 
      group op by op.OrderProductID 
      select new 
      { 
       ID = op.Key, 
       ProductID = op.FirstOrDefault().ProductID, 
       Model = op.FirstOrDefault().Model, 
       Name = op.FirstOrDefault().Name, 
       SalePrice = op.FirstOrDefault().SalePrice, 
       Qty = op.Select(p => p.products_quantity).Sum(), 
       CountedQty = op.Select(p => p.CountedQty).Sum(), 
      }) 
      .OrderBy(op => op.ProductID) 
      .ThenBy(op => op.OrderProductID);