使用其他方法创建子项的实体从RIA Services调用查询

时间:2012-08-07 18:34:04

标签: linq entity-framework wcf-ria-services

我有一些不起作用的代码,因为Entity Framework无法识别CreateItemDC方法。 CreateItemDC是一种模块化私有方法,可为给定的Item实体创建数据协定。每当我需要返回Item数据合约时,我在整个服务中都使用CreateItemDC,但我不能在这里使用它。我可以将ProjectItems的序列实现为数组或可枚举,因为我必须对数据库中的所有ProjectItem实体执行此操作,因为在客户端上指定了查询条件并且我无权访问在这里。我有更好的选择吗?似乎RIA Services不值得这么麻烦。我真的希望我在这个项目中使用普通的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
               };
    }

P.S。我确实喜欢LINQ和E.F. :)

2 个答案:

答案 0 :(得分: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 Services动态查询功能,但这几乎是普通老WCF所能得到的,不是吗?

如果您需要WCF Ria动态排序/过滤/分组,则必须执行一些额外步骤,包括访问WCF Ria Services为您创建的Expression。

HTH

答案 1 :(得分: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{...};
}