0

私は3つのオブジェクトを持っています:

  1. イベント (関係: 多くの EventProducts を持っています)

  2. Product (関係: 多くの EventProducts を持っています)

  3. EventProduct (関係: 多くのイベントと、多くの製品と、製品ごとおよびイベントごとに保存する必要がある、quantity_sold、quantity_allocated などのプロパティがあります)

私のアプリケーションでは、誰かがイベントをクリックすると、すべての製品のリストで新しいウィンドウが初期化されます。そこから、誰かがイベントをクリックしたときに、WPF にデータグリッドを設定する必要があるセルを変更できます。したがって、このコードのコンテキストでは、イベントは既知で一定です。

私が抱えている問題は、デフォルトのタイプの EventProduct を作成することです。

私が必要とするのは、DBにEventProductがない場合、EventProductをインスタンス化するクエリを持つことですEventProduct.Event = currentEvent(currentEventは、このクエリで作成されたすべてのEventProductsに対して一定になります)およびEventProduct.Product = product(製品は行ごとに変更されます)

このコード、関連付けられた EventProduct がデータベースにある場合にうまく機能します。しかし、そうでない場合、私の選択は私の製品を正常に返しますが、EventProduct 全体が null です。

var query2 = from product in dbContext.Products
             join eventProduct in dbContext.EventProducts
                 on new { pIndex = product.index, eIndex = currentEvent.index }
                 equals new { pIndex = eventProduct.Product.index, eIndex = eventProduct.Event.index } into temp
             from eventProduct in temp.DefaultIfEmpty() // this is my problem line
             select new { 
                    Product = product,
                    EventProduct = eventProduct
              };

EventProduct(Event e, Product p)コンストラクターを作成して、メソッドのコンストラクターに値を渡そうとしましたがDefaultIfEmpty()、コンストラクターがそのように使用するには引数が 0 である必要があるというエラーが発生します。EventProduct() オブジェクトに関連付ける必要がある Event と Product を伝える方法がないため、これを行うことはできません。

新しい EventProduct を作成してそのプロパティを設定するだけで、コンストラクターも試しませんでしたが、「エンティティまたは複合型 ...EventProduct は LINQ to Entites クエリで構築できません」というエラーが表示されます。

Product最終結果で、私は自分のとを選択したいと思いますEventProduct。そのとのEventProduct両方に が関連付けられていない場合、EventProduct の選択は、currentEvent、現在の行の Product、およびすべてのプロパティがデフォルト値に設定されたデフォルトに設定する必要があります (すべて 10 進数で、この場合は 0 にする必要があります)。 .ProductEvent

編集:このクエリを試したところ、サポートされていないエラーも表示されます:

var query2 = from product in dbContext.Products
             join eventProduct in dbContext.EventProducts
                 on new { pIndex = product.index, eIndex = currentEvent.index }
                 equals new { pIndex = eventProduct.Product.index, eIndex = eventProduct.Event.index } into temp
             from eventProduct in temp.DefaultIfEmpty()
             select new { 
                 Product = product,
                 EventProduct = eventProduct != null ?
                 eventProduct : new EventProduct
                 {
                     Product = product,
                     Event = currentEvent,
                     quantity_allocated = 0,
                     quantity_sold = 0,
                     quantity_sampled = 0
                 }
             };

編集:この手法で解決:

1) 匿名オブジェクトは読み取り専用であるため、オブジェクトを作成します。

    class Associations
    {
        public class ProductEventProduct
        {
            public Product Product { get; set; }
            public EventProduct EventProduct { get; set; }
        }
    }

2) データセット内の null オブジェクトごとに、デフォルト オブジェクトに置き換えます

var query = from product in dbContext.Products
                         join eventProduct in dbContext.EventProducts
                             on new { pIndex = product.index, eIndex = currentEvent.index }
                                equals new { pIndex = eventProduct.Product.index, eIndex = eventProduct.Event.index } into temp
                         from eventProduct in temp.DefaultIfEmpty()
                         select new Associations.ProductEventProduct { 
                             Product = product,
                             EventProduct = eventProduct
                         };
            var dataSource = query.ToList();

            foreach (Associations.ProductEventProduct entry in dataSource)
            {
                if (entry.EventProduct == null)
                {
                    entry.EventProduct = new EventProduct
                    {
                        Product = entry.Product,
                        Event = currentEvent,
                        quantity_allocated = 0,
                        quantity_sold = 0,
                        quantity_sampled = 0
                    };
                }
            }
4

2 に答える 2