我有一些不起作用的代码,因为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. :)
答案 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{...};
}