1

式ツリーを動的に作成しようとしています。

2つの単純なクラスがあると仮定します。

class CustomerType
{
   public int Id { get; set; }
   public string Name { get; set; }
   public OrderType[] Orders { get; set; }
}

class OrderType
{
   public int Id { get; set; }
   public DateTime Date { get; set; }
   public decimal Price { get; set; }
}

..および関連付けのない対応するエンティティタイプ(したがって、カスタム結合を使用する必要があります)。

顧客のリストに対応する注文を入力する必要があります。Linqには、左外部結合と左内部結合の2種類の結合があることを知っています。

したがって、左外部結合を使用して、次のクエリを記述できます(簡単にするために、カスタムのExpressionTreeジェネレーターコードの代わりにLinq式を使用して質問を説明します)。

var query = from c in db.Customers
            join o in db.Orders on c.Id equals o.CustomerId into g
            select new AccountType() 
            {
              Id = c.Id,
              Name = c.Name,
              Orders = g
            };

したがって、AccountTypeオブジェクトのOrdersプロパティには、対応するすべてのOrdersが含まれます。

注文テーブルのフィールドに基づいて、左内部結合を使用してフィルタリングで同じ結果を得る方法がわかりません(たとえば、価格が100.00を超える注文があるすべての顧客にクエリを実行する必要があります)。

var query = from c in db.Customers
            join o in db.Orders on c.Id equals o.CustomerId 
            where o.Price > 100.00
            select new AccountType() 
            {
              Id = c.Id,
              Name = c.Name,
              Orders = ???
            };

助けてくれてありがとう!

4

1 に答える 1

3

私はそのようにします:

var query = from c in db.Customers
            join o in db.Orders on c.Id equals o.CustomerId into g
            select new AccountType() 
            {
              Id = c.Id,
              Name = c.Name,
              Orders = g.Where(o => o.Price > 100.00)
            };

内部結合では、次のgroup by句を使用する必要があります。

var query = from c in db.Customers
            join o in db.Orders on c.Id equals o.CustomerId 
            where o.Price > 100.00
            group o by c into g
            select new AccountType() 
            {
                Id = g.Key.Id,
                Name = g.Key.Name,
                Orders = g
            }
于 2009-09-01T09:53:34.883 に答える