0

一部の LinQ を WCF サービス操作内で動作させるのに問題があります。

[WebGet]
public IQueryable<StockItem> AllStockableItems(int LocationAddressId)
    {
    StockEntities svc = this.CurrentDataSource;

    //get all the stock at a location
    var StockAtLocation = from s in svc.Stock
                          where s.Location == Location
                          select s;

    //weave it into the list of all stockable items
    var StockableItems = from si in svc.StockableItems
                         join s in StockAtLocation on si.ItemId equals s.ItemId into tmp
                         select si <and somehow expand> si.Stock;

    return StockableItems;
    }

問題は、返されたデータで在庫を拡張する方法がわからないことです。

次のような URL:

....my.svc/AllStockableItems?LocationAddressId=3&$expand=在庫

必要な場所だけでなく、すべての場所の在庫を拡大します。これは可能ですか、それとも Silverlight クライアントから 2 つの別々の要求を作成し、クライアント側に参加するのが最善の策ですか?

どんな助けでも大歓迎です。

はい、データの例です。最初に入れなくてすみません: 株式データの例:

ItemId    Location   Quantity
   1         1           4
   1         2           3
   1         3           2
   2         2           6
   3         3           0
   7         1           3
   7         2           0

stockableItems データの例

 ItemId   <other columns>..
   1
   2
   3
   4
   5
   6
   7
   8

locationAddressId パラメーター = 2 と言って、サービス操作を取得しようとしています (文字通りではなく、Atom/Pub に相当します)。

StockableItem  { ItemId :1 
                 Stock { 
                     entry { 
                           Stock {LocationId : 2, Qty :4} 
                           } 
                       } 
               }
StockableItem  { ItemId :2 }
StockableItem  { ItemId :3 }
StockableItem  { ItemId :4 }
StockableItem  { ItemId :5 }
StockableItem  { ItemId :6 }
StockableItem  { ItemId :7 
             Stock { 
                     entry { 
                           Stock {LocationId : 2, Qty :0} 
                           } 
                   } 
               }
StockableItem  { ItemId :8 }

ありがとうございました。

【アップデート2】

わかりました、私はいくつかのことを試しました。まず、私はこれを試してみました:

var StockableItems = from si in svc.AllStockableItems
                     join s in svc.Stock on si.ItemId equals s.ItemId
                     where s.Location == Location
                     select  new StockableItem
                           {
                           ItemId = s.ItemId,
                           Stock = new EntityCollection<Stock>
                                    {
                                    new Stock()
                                        {
                                        Location = s.Location,
                                        Quantity= s.Quantity
                                        }
                                    }
                           };

それは私に与えました:

The entity or complex type '...' cannot be constructed in a LINQ to Entities query

ここに私を導いた:

LINQ to Entities クエリでエンティティを作成することはできません

これにより、クエリを次のように書き直すことになりました。

var StockableItems = svc.AllStockableItems
                    .Join(svc.Stock, si => si.ItemId, s => s.ItemId, (si, s) => si)
                    .ToList()
                    .Select(si => new StockableItem
                       {
                       ItemId = si.ItemId,
                       Stock = new EntityCollection<Stock>
                           {
                           new Stock()
                                {
                                Location = si.Stock.First().Location,
                                Quantity= si.Stock.First().Quantity
                                }
                           }
                       })
                       .AsQueryable();

これはすべての StockableItems を返しますが、ややイライラすることに、Stock は含まれていません。この最後のクエリでブーブーをしただけですか? Stock エンティティの内部投影が間違っていると思われますか?

再度、感謝します

4

1 に答える 1

0

私はあなたがこのようなものを探していると思います:

var StockableItems = from si in svc.StockableItems
    join s in StockAtLocation on si.ItemId equals s.ItemId
    select new
    {
        StockableItem = si,
        Stock = s
    };

select 句で出力を投影する方法を選択できます。上記のようにオブジェクト全体を選択することも、オブジェクト内のフィールドを選択することもできます。例えば:

    select new
    {
        ItemId = si.ItemId,
        Stock = s,
        Qty = s.Quantity
    };

また、2 つのクエリを 1 つのクエリに結合することを検討することもできます。

var StockableItems = from si in svc.StockableItems
    join s in svc.Stock on si.ItemId equals s.ItemId
    where s.Location == Location
    select new
    {
        StockableItem = si,
        Stock = s
    };

そして、出力例に非常に近いものを示すもう 1 つの例:

var StockableItems = from si in svc.StockableItems
    join s in svc.Stock on si.ItemId equals s.ItemId
    where s.Location == Location
    select new
    {
        StockableItem = new
        {
            ItemId = s.ItemId,
            Stock = new
            {
                LocationId = s.Location,
                Qty = s.Quantity
            }
        }
    };

アップデート

Joinを使用して残りのクエリに渡されるデータを作成する、変更されたクエリにいくつかの調整を加えました。またWhere、場所をフィルタリングするために、句をそこに戻します(そこで使用したい場合)。また、ToList() が必要かどうかわからないので、そこから取り出しました。

var StockableItems = svc.AllStockableItems 
                .Join(svc.Stock, si => si.ItemId, s => s.ItemId, 
                      (si, s) => new 
                      { 
                          ItemId = si.ItemId, 
                          Location = s.Location, 
                          Quantity = s.Quantity
                      }) 
                .Where(x => x.Location == Location)
                //.ToList() 
                .Select(x => new StockableItem 
                   { 
                   ItemId = x.ItemId, 
                   Stock = new EntityCollection<Stock> 
                       { 
                       new Stock() 
                            { 
                            Location = x.Location, 
                            Quantity= x.Quantity 
                            } 
                       } 
                   }) 
                   .AsQueryable(); 
于 2012-07-27T13:38:42.897 に答える