私は最初にEntityFramework4.3.1とデータベースをdbcontextで使用しています。
顧客と注文の間に1対多の関係がある顧客と注文 の 2つのテーブルが あるとします。
EntityFrameworkを使用して実行し、さまざまなWebページの特定の情報を取得するクエリが2つあります。
1つ目は 、特定の日付以降に注文したすべての顧客を取得することです。
したがって、このクエリのプレーンSQLは次のようになります。
SELECT * FROM Customer WHERE CustomerID IN (
SELECT CustomerID FROM Order WHERE OrderDate > '01-01-2012'
)
EntityFrameworkでこれを行う方法がわかりません。
私は次のコードから始めましたが、ここからどこに行くべきかわかりません。
var customersWithOrdersAfterGivenDate = this._dbContext.Customer
.Include("Order")
.Where(c => ??? What do I do here ??? );
(c.Order.OrderDate> someDate)を実行しようとしましたが、EntityFrameworkがOrderをコレクションとして処理しているため、OrderからOrderDateプロパティを取得できないため、これは機能しません。
2番目の問題は次のとおりです。 特定のコレクションまたは顧客の注文の総数を取得する
このクエリのプレーンSQLは次のようになります。
SELECT CustomerID, COUNT(*)
FROM Order
WHERE CustomerID IN (*someCollectionOfIDs*)
GROUP BY CustomerID
繰り返しますが、EntityFrameworkでこれを行う方法がわかりません。OrderテーブルからCustomerIDとCustomerIDのレコードの総数のみを取得するにはどうすればよいですか?各顧客のすべての注文レコードを返すだけではないように、groupbyを実行する方法がわかりません。
----------------------------------
更新:Eliからのフィードバック後の最終的なコードは次のとおりです。
特定の日付以降に作成された注文を持つ顧客を取得するには:
var customerIDs = dbContext.Customer
.Include("Order")
.Where(c => c.Order.Any(o => o.DateCreated.CompareTo(startDate) > 0))
.Select(s => new
{
c.CustomerID
})
.AsEnumerable()
.Select(cust => cust.CustomerID)
.ToList<int>();
特定の顧客コレクション内の各顧客の注文の総数を取得するには、次のようにします。
List<int> customerIDs = GetCustomerIDsToQuery();
var orderTotals = dbContext.Orders
.Where(o => customerIDs.Contains(o.CustomerID))
.GroupBy(o => o.CustomerID)
.Select(o => new
{
CustomerID = o.Key,
TotalOrders = o.Count()
})
.AsEnumerable();
上記から、コレクションを反復処理して、匿名タイプから値を取得できます。
foreach(var ot in orderTotals)
{
var customerID = ot.CustomerID;
var totalOrders = ot.TotalOrders;
//Do something with these values...
}