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;
    }

问题是,我不知道如何扩展返回数据中的库存?

如下所示的网址:

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

将扩大所有地点的库存,而不仅仅是所需的地点。这是可能的还是我最好的选择是从 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
    };

此外,您可能需要考虑将两个查询合并为一个查询:

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
    };

现在还有一个示例向您展示了与示例输出非常接近的内容:

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 回答