2013-11-28 139 views
1

我正在學習LINQ。任何人都可以幫助我解決以下問題!LINQ組通過子句Where子句

羅斯文客戶訂單表:

我想 「找到所有誰做了20多個訂單客戶」

查詢SQL Server中同樣是:

SELECT * FROM Customers WHERE CustomerID in (SELECT CustomerID FROM Orders GROUP BY CustomerID HAVING COUNT(CustomerID) > 20) 

但是,我無法在LINQ中寫入等價物。

我試圖象下面這樣:

var customers = ctx.Customers.Where(o => o.CustomerID.Count() > 20).GroupBy(o => o.CustomerID); 

我歌廳在事件日誌中出現以下錯誤:

異常信息: 異常類型:HttpCompileException 異常消息:E:\阿肖克\ WEB \ VS2012 \ CSHWEB \ CSHWEB \ LINQ01.aspx(17):錯誤CS0103:當前上下文中不存在「訂單」名稱

原因是依賴訂單表可能尚未加載。但是,我不理解如何使它工作!

+1

發佈您的完整代碼 –

+2

在哪些情況下您使用LINQ? LINQ2SQL?的EntityFramework?模型第一?代碼優先?流利? – mehrandvd

+0

@mehrandvd:LINT到SQL。情境如何重要? –

回答

1

對象之間的關係應正確配置。如果您使用實體框架只是標誌着Customers實體Orders財產virtual這將允許延遲加載。那麼你的查詢將會簡單得多。否則,你仍然可以從Orders而不是Customers開始:

var customers = ctx.Orders.GroupBy(c => c.CustomerID) 
          .Where(x => x.Count() > 20) 
          .SelectMany(g => g.Select(o => o.Customer)); 

,爲客戶(與virtual訂單集合)很簡單:

var customers = ctx.Customers.Where(c => c.Orders.Count() > 20); 
+0

嗨, 感謝您的回覆。但是,您的代碼沒有編譯並顯示錯誤g.Value –

+0

@Ashokkumar更新。 –

1

如果客戶與訂單相關的(1:多)和你建立了你的對象模型來反映這一點,你可以這樣做:

var customers = ctx.Customers.Where(c => c.Orders.Count() > 20); 

如果沒有,那麼:

var customerIds = ctx.Orders.GroupBy(x => x.CustomerID) 
.Where(x => x.Count() > 20); 
.SelectMany(x => x.CustomerID); 

var customers = ctx.Customers.Where(x => customerIds.Contains(x.CustomerID)); 
+0

嗨, 感謝您的回覆。但是,你的代碼不工作。我收到以下錯誤: 「訂單」名稱在當前上下文中不存在 請求您在發送答覆之前驗證代碼。 –

1

你可以做這樣的事情:

var customers = from c in Customers where c.Orders.Count() > 20 select c; 
customers.GroupBy(o => o.CustomerID); 
+0

嗨, 您的代碼給出了以下錯誤: 當前上下文中不存在「訂單」名稱 請求您在發送前驗證一次代碼。 –

1

嘗試使用join..into clause像這樣

var customers = from c in ctx.Customers 
       join o in ctx.Orders on c.CustomerID equals o.CustomerID into orders 
       where orders.Count()>20 
       select c; 
+0

嗨, 您的代碼給出了以下錯誤:「名稱'訂單'不存在於當前上下文中' –

+0

@Ashokkumar請參閱msdn [演練:創建LINQ to SQL類(O/R設計器)](http:/ /msdn.microsoft.com/ru-ru/library/bb384428.aspx) – Grundy

1

爲了寫這樣的查詢,你需要使用一個數據庫關係(導航屬性)。這種關係應在您的上下文中聲明爲Customer.Orders。之後,您可以使用Linq查詢上下文。 檢查了這一點的描述你所需要的一個例子。http://msdn.microsoft.com/en-us/library/bb425822.aspx

但是你可以聲明像背景:

public partial class Northwind : DataContext 
{ 
    public Table<Customer> Customers; 
    public Table<Order> Orders; 
    public Northwind(string connection): base(connection) {} 
} 

,你應該定義你的客戶喜歡類:

[Table(Name="Customers")] 
public class Customer 
{ 
    [Column(Id=true)] 
    public string CustomerID; 
    ... 
    private EntitySet<Order> _Orders; 
    [Association(Storage="_Orders", OtherKey="CustomerID")] 
    public EntitySet<Order> Orders { 
     get { return this._Orders; } 
     set { this._Orders.Assign(value); } 
    } 
} 

然後你就可以查詢它像其他的答案說。

+0

希望你已經看到我的意見,其他答案。 –