Linq 使用具有由其他方法创建的子项的实体从RIA服务调用查询
我有一些代码不起作用,因为Entity Framework无法识别Linq 使用具有由其他方法创建的子项的实体从RIA服务调用查询,linq,entity-framework,wcf-ria-services,Linq,Entity Framework,Wcf Ria Services,我有一些代码不起作用,因为Entity Framework无法识别CreateItemDC方法CreateItemDC是一个模块化的私有方法,它为给定的项实体创建数据契约。每当我需要返回项目数据合同时,我会在整个服务过程中使用CreateItemDC,但我不能在这里使用它。我可以将ProjectItems序列实现为一个数组或可枚举项,因为我必须对数据库中的所有ProjectItem实体执行此操作,因为查询条件在客户端上指定,我在这里没有访问权。我这里有更好的选择吗?看来RIA服务不值得这么麻烦。
CreateItemDC
方法CreateItemDC
是一个模块化的私有方法,它为给定的项
实体创建数据契约。每当我需要返回项目数据合同时,我会在整个服务过程中使用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
};
}
[查询]
公共IQueryable GetProjectItems()
{
从ObjectContext.ProjectItems中的projectItem返回
选择new ProjectItemDC
{
ID=projectItem.ID,
LibraryItem=CreateItemDC(projectItem.LibraryItem),
LibraryItemID=projectItem.LibraryItemID,
ProjectID=projectItem.ProjectID,
数量=项目项数量,
宽度=投影项宽度,
高度=投影项目高度,
深度=投影项目深度,
SheetMaterialID=projectItem.SheetMaterialID,
BandingMaterialID=projectItem.BandingMaterialID,
MaterialVolume=项目项MaterialVolume,
物料重量=项目物料重量
};
}
另外,我确实喜欢林克和E.F.:) 好吧,如果您想使用普通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();
}
[查询(IsComposable=false)]
公共IEnumerable GetProjectItems(字符串myParm1、字符串myParm2)
{
从ObjectContext.ProjectItems中的projectItem返回
选择new ProjectItemDC
{
ID=projectItem.ID,
LibraryItem=CreateItemDC(projectItem.LibraryItem),
LibraryItemID=projectItem.LibraryItemID,
ProjectID=projectItem.ProjectID,
数量=项目项数量,
宽度=投影项宽度,
高度=投影项目高度,
深度=投影项目深度,
SheetMaterialID=projectItem.SheetMaterialID,
BandingMaterialID=projectItem.BandingMaterialID,
MaterialVolume=项目项MaterialVolume,
物料重量=项目物料重量
}.ToArray();
}
编写自己的筛选/排序逻辑,就完成了。
是的,您已经失去了WCF Ria服务的动态查询功能,但这正是您使用普通的旧WCF所得到的,不是吗
如果您需要WCF Ria动态排序/过滤/分组,则必须执行一些额外的步骤,包括访问WCF Ria服务为您创建的表达式
HTH好吧,如果您想使用普通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();
}
[查询(IsComposable=false)]
公共IEnumerable GetProjectItems(字符串myParm1、字符串myParm2)
{
从ObjectContext.ProjectItems中的projectItem返回
选择new ProjectItemDC
{
ID=projectItem.ID,
LibraryItem=CreateItemDC(projectItem.LibraryItem),
LibraryItemID=projectItem.LibraryItemID,
ProjectID=projectItem.ProjectID,
数量=项目项数量,
宽度=投影项宽度,
高度=投影项目高度,
深度=投影项目深度,
SheetMaterialID=projectItem.SheetMaterialID,
BandingMaterialID=projectItem.BandingMaterialID,
MaterialVolume=项目项MaterialVolume,
物料重量=项目物料重量
}.ToArray();
}
编写自己的筛选/排序逻辑,就完成了。
是的,您已经失去了WCF Ria服务的动态查询功能,但这正是您使用普通的旧WCF所得到的,不是吗
如果您需要WCF Ria动态排序/过滤/分组,则必须执行一些额外的步骤,包括访问WCF Ria服务为您创建的表达式
HTH您可以对ObjectContext.ProjectItems
调用ToArray()
以强制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
};
}
您可以对ObjectContext.ProjectItems
调用ToArray()
,以强制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
};
}
如何获取表达式?重写DomainService类的查询方法,如果客户端已指定表达式,则参数queryDescription的属性查询将被定值。因此,您可以获取queryDescription.Query.Expression如何获取表达式?重写DomainService类的查询方法,如果客户端已指定表达式,则参数queryDescription的属性查询将被定值。因此,您可以获取queryDescription.Query.expression这将在数据库中每个
项目项实体的内存中创建一个数组。这不是一个选项。除非您在客户机上编写查询,否则您已经在提取所有数据。这就是我最后要做的。我的下一个项目将使用WCF。我想如果你做的是纯CRUD RIA服务是有道理的,但我在过去一年左右遇到了很多困难,所以我很担心