2

次の SAMPLE オブジェクト モデルを処理するエレガントな linq クエリを書きたいと思います。

    class Category
    {
        public string Name { get; set; }        
        public IList<Product> Products { get; set;}        
    }

    class Product
    {
        public string Title { get; set; }
        public IList<Photo> Photos { get; set; }
    }

    class Photo
    {
        public int Id { get; set; }
    }

写真 ID を取得するために、次のクエリを作成しました。

    var query = from category in Factory.GetCategories()
                where category.Name == "Cameras"
                select (from product in category.Products
                        where product.Title == "Sony"
                        select (from photo in product.Photos
                                select photo.Id)
                               );

    var v = query.ToList();

現時点では、クエリが正しく投影されません。各 Sub Selects に FirstOrDefault() を追加する必要があります!:

var query = from category in Factory.GetCategories()
                where category.Name == "Cameras"
                select (from product in category.Products
                        where product.Title == "Sony"
                        select (from photo in product.Photos
                                select photo.Id).FirstOrDefault()
                               ).FirstOrDefault();

var v = query.ToList();

これを行うより良い方法はありますか?データベースを扱っておらず、PK/FK が機能していないという事実を無視します。

linq クエリで同じことを実行できる場合は、大きな for ループを作成することは避けたいと思います。

foreach (var category in Factory.GetCategories())
            {
                if (category.Name == "Camera")
                {
                    foreach (var product in category.Products)
                    {
                        if (product.Title == "Sony")
                        {
                            foreach (var photo in product.Photos)
                            {
                                //get data
                                int id = photo.Id;
                            }
                        }
                    }
                }                
            }

実際の実装は、この単純なオブジェクト モデルよりも複雑です。この単純なサンプルから基本的なアイデアを得たいので、実際のオブジェクト モデルに適用します。

乾杯!

4

4 に答える 4

5

フラット化されたIDが必要ですか?

        var query = from category in Factory.GetCategories()
                    where category.Name == "Cameras"
                    from product in category.Products
                    where product.Title == "Sony"
                    from photo in product.Photos
                    select photo.Id;
于 2009-02-25T15:12:35.580 に答える
2

そうです。「the」写真 ID というものがないため、FirstOrDefault を追加する必要があります。カメラごとに多くの写真がある可能性があります。どれが必要ですか?

最初の写真だけを気にする場合は問題ありませんが、複数の "from" 句を使用すると作業が楽になります。

var query = from category in Factory.GetCategories()
            where category.Name == "Cameras"
            from product in category.Products
            where product.Title == "Sony"
            select product.Photos.Select(photo => photo.Id)
                                 .FirstOrDefault();

写真のない商品の場合は 0 が返されることに注意してください。それはあなたが望むものですか?

お客様の要件をより明確にしていただけると、より適切なサポートを提供できます。

編集: Sony カメラの最初の ID のみが必要な場合は、次を使用します。

var query = from category in Factory.GetCategories()
            where category.Name == "Cameras"
            from product in category.Products
            where product.Title == "Sony"
            from photo in product.Photos
            select photo.Id;
var firstId = query.FirstOrDefault();
于 2009-02-25T15:13:19.993 に答える
1

他の人と同じ答えですが、クエリ理解の代わりに拡張メソッド呼び出しを使用します。 SelectMany子コレクションを「解凍」して、そのレベルでクエリを続行できます。

var query = Factory.GetCategories()
  .Where(category => category.Name == "Cameras")
  .SelectMany(category => category.Products)
  .Where(product => product.Title == "Sony")
  .SelectMany(product => product.Photos)
  .Select(photo => photo.Id);
于 2009-02-25T16:14:08.690 に答える
0
        var ids = from category in Factory.Categories
                  where category.Name == "Cameras"
                  from product in category.Products
                  where product.Title == "Sony"
                  from photo in product.Photos
                  select photo.Id;

写真のすべての ID を返します。写真がない場合、列挙型は空です。最初のものが必要な場合、またはデフォルトが 0 の場合:

var result = ids.FirstOrDefault();
于 2009-02-25T15:20:24.077 に答える