1

我有这段代码不起作用,因为 Entity Framework 无法识别该CreateItemDC方法。 是为给定实体CreateItemDC创建数据契约的模块化私有方法。Item每当我需要返回项目数据合同时,我会在整个服务中使用CreateItemDC所有功能,但我不能在这里使用它。我可以实现ProjectItems数组或可枚举的序列,因为我必须对ProjectItem数据库中的所有实体执行此操作,因为查询条件是在客户端上指定的,而我在这里无权访问它。我在这里有更好的选择吗?似乎 RIA 服务不值得麻烦。我真的希望我在这个项目中使用了普通的 WCF。

    [Query]
    public IQueryable<ProjectItemDC> GetProjectItems()
    {
        return from projectItem in ObjectContext.ProjectItems
               select new ProjectItemDC
               {
                   ID = projectItem.ID,
                   LibraryItem = CreateItemDC(projectItem.LibraryItem),
                   LibraryItemID = projectItem.LibraryItemID,
                   ProjectID = projectItem.ProjectID,
                   Quantity = projectItem.Quantity,
                   Width = projectItem.Width,
                   Height = projectItem.Height,
                   Depth = projectItem.Depth,
                   SheetMaterialID = projectItem.SheetMaterialID,
                   BandingMaterialID = projectItem.BandingMaterialID,
                   MaterialVolume = projectItem.MaterialVolume,
                   MaterialWeight = projectItem.MaterialWeight
               };
    }

PS 我确实喜欢 LINQ 和 EF。:)

4

2 回答 2

1

好吧,如果你想使用普通的 WCF,你可以,没问题,只需将代码更改为

[Query(IsComposable=false)]
public IEnumerable<ProjectItemDC> GetProjectItems(string myParm1, string myParm2) 
    { 
        return from projectItem in ObjectContext.ProjectItems 
               select new ProjectItemDC 
               { 
                   ID = projectItem.ID, 
                   LibraryItem = CreateItemDC(projectItem.LibraryItem), 
                   LibraryItemID = projectItem.LibraryItemID, 
                   ProjectID = projectItem.ProjectID, 
                   Quantity = projectItem.Quantity, 
                   Width = projectItem.Width, 
                   Height = projectItem.Height, 
                   Depth = projectItem.Depth, 
                   SheetMaterialID = projectItem.SheetMaterialID, 
                   BandingMaterialID = projectItem.BandingMaterialID, 
                   MaterialVolume = projectItem.MaterialVolume, 
                   MaterialWeight = projectItem.MaterialWeight 
               }.ToArray(); 
    } 

编写你自己的过滤/排序逻辑,你就完成了。是的,您已经失去了 WCF Ria 服务动态查询功能,但这几乎就是您使用普通的旧 WCF 所获得的,不是吗?

如果您需要 WCF Ria 动态排序/过滤/分组,则必须采取一些额外的步骤,包括访问 WCF Ria 服务为您创建的表达式。

高温高压

于 2012-08-08T10:58:56.510 回答
0

您可以调用ToArray()反对ObjectContext.ProjectItems以强制 EF 加载所有项目,但是,您的查询将不再可在客户端上组合。

[Query]
public IQueryable<ProjectItemDC> GetProjectItems()
{
    return from projectItem in ObjectContext.ProjectItems.ToArray()
           select new ProjectItemDC
           {
               ID = projectItem.ID,
               LibraryItem = CreateItemDC(projectItem.LibraryItem),
               LibraryItemID = projectItem.LibraryItemID,
               ProjectID = projectItem.ProjectID,
               Quantity = projectItem.Quantity,
               Width = projectItem.Width,
               Height = projectItem.Height,
               Depth = projectItem.Depth,
               SheetMaterialID = projectItem.SheetMaterialID,
               BandingMaterialID = projectItem.BandingMaterialID,
               MaterialVolume = projectItem.MaterialVolume,
               MaterialWeight = projectItem.MaterialWeight
           };
}

编辑:

正如您在评论中提到的,它一次将所有数据从数据库中取出,这并不理想。为了LibraryItem使用您的私有方法创建,您不能在客户端上编写查询。相反,您应该在查询方法中进行过滤,然后创建数组。

[Query]
public IQueryable<ProjectItemDC> GetProjectItems(int id, string filter, object blah)
{
    var projectItems = ObjectContext.ProjectItems.Where(...).ToArray();
    return projectItems.Select(projectItem => new ProjectItemDC{...};
}
于 2012-08-08T23:31:21.903 回答