一部の 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 エンティティの内部投影が間違っていると思われますか?
再度、感謝します