3

私は最初に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...
}
4

2 に答える 2

3

SQLにはネストされたコレクションも含まれているため、LINQは同じになります。の線に沿った何か.Where(c => c.Orders.Any(order => order.OrderDate > someDate));

于 2012-11-16T19:40:52.260 に答える
1

int noOfRecords = _dbContext.Customer.Count();

これにより、EntityFrameworkのテーブル内のレコード数が返されます。

于 2015-11-16T23:54:31.223 に答える