我正在开发基于此框架的VS2010解决方案:http://ntieref.codeplex.com/ 一切都很好,我可以查询我的数据库(MS SQLServer 2008)并保存更改。
现在我正在尝试查询一个表(Projects)加入另一个表(项目用户关联)并按键过滤(用户键),如下所示:
var query = from p in ctx.C__E_PROJECTS.AsQueryable()
join pu in ctx.CUMR_USER_PROJECTS_ASSOCIATION.AsQueryable() on p.CD_PROJECT equals pu.RF_PROJECT
where pu.RF_USER == 1
select p;
但我收到[System.NotImplementedException] = {“方法或操作未实现。”} at NTier.Client.Domain \ QueryProvider.cs:第382行(它是N层实体框架库的一部分)。
同样替换这样的连接会产生相同的异常:
var query2 = from p in ctx.C__E_PROJECTS.AsQueryable()
from pu in ctx.CUMR_USER_PROJECTS_ASSOCIATION.AsQueryable()
where p.CD_PROJECT == pu.RF_PROJECT
&& pu.RF_USER == 1
select p;
我做错了吗? 是否有另一种方法可以在与另一个表的连接中过滤表?
这是两个表的定义: (其中实体是NTier.Common.Domain.Model.Entity)
[DataContract(IsReference = true)]
[KnownType(typeof(C__E_PROJECT_VERSIONS))]
[KnownType(typeof(CUMR_USER_PROJECTS_ASSOCIATION))]
[MetadataType(typeof(C__E_PROJECTSMetadata))]
public class C__E_PROJECTS : Entity<C__E_PROJECTS>, INotifyPropertyChanged, INotifyPropertyChanging, IDataErrorInfo
{
public C__E_PROJECTS();
[DataMember]
[NavigationProperty]
public TrackableCollection<C__E_PROJECT_VERSIONS> C__E_PROJECT_VERSIONS { get; set; }
[DataMember]
[Required]
[SimpleProperty]
[ServerGeneration(1)]
[Key]
public int CD_PROJECT { get; set; }
[NavigationProperty]
[DataMember]
public TrackableCollection<CUMR_USER_PROJECTS_ASSOCIATION> CUMR_USER_PROJECTS_ASSOCIATION { get; set; }
[DataMember]
[SimpleProperty]
public string DS_PROJECT { get; set; }
[SimpleProperty]
[DataMember]
[Required]
public string ID_PROJECT { get; set; }
protected override void ClearNavigationProperties();
protected override int GetKeyHashCode();
protected override bool IsKeyEqual(C__E_PROJECTS entity);
}
[DataContract(IsReference = true)]
[KnownType(typeof(CUME_USERS))]
[MetadataType(typeof(CUMR_USER_PROJECTS_ASSOCIATIONMetadata))]
[KnownType(typeof(C__E_PROJECTS))]
public class CUMR_USER_PROJECTS_ASSOCIATION : Entity<CUMR_USER_PROJECTS_ASSOCIATION>, INotifyPropertyChanged, INotifyPropertyChanging, IDataErrorInfo
{
public CUMR_USER_PROJECTS_ASSOCIATION();
[NavigationProperty]
[DataMember]
public C__E_PROJECTS C__E_PROJECTS { get; set; }
[DataMember]
[SimpleProperty]
public bool? CAN_READ { get; set; }
[DataMember]
[NavigationProperty]
public CUME_USERS CUME_USERS { get; set; }
[DataMember]
[Key]
[Required]
[SimpleProperty]
public int RF_PROJECT { get; set; }
[SimpleProperty]
[Key]
[DataMember]
[Required]
public int RF_USER { get; set; }
protected override void ClearNavigationProperties();
protected override int GetKeyHashCode();
protected override bool IsKeyEqual(CUMR_USER_PROJECTS_ASSOCIATION entity);
}
作为一种解决方法,我在SQL Server存储过程中实现了连接查询,该过程返回查询结果,并将存储过程添加到edmx模型中。一切都好。
现在保存edmx或运行“N-Tier Entity Generator”自定义工具,我希望在客户端的上下文中具有相关功能,但它缺失了。我可以在XXX.Server.Domain.Repositories项目中看到它,但它不会传播到客户端。我是否必须编辑T4模板?
谢谢! 罗伯特
答案 0 :(得分:1)
关于您的更新,请尝试以下操作:
var query = from p in ctx.PROJECTS.AsQueryable().Include("USER_PROJECTS_ASSOCIATION")
from q in p.USER_PROJECTS_ASSOCIATION.AsQueryable()
where q.USER_PROJECTS_ASSOCIATION.RF_USER==1
select p; // or try Select q;
我希望它会对你有所帮助。
答案 1 :(得分:0)
一般......
N-Tier Entity Framework生成客户端和服务器代码,以查询支持排序(orderby等),过滤(where),分页(skip和take)以及包括关系(include)的实体。此操作是端到端的,即客户端定义linq查询,通过WCF传输到服务器并最终在数据库上执行。可以在服务器(DataService)或客户端数据上下文(DataContext)上手动添加更复杂的查询操作,如投影,聚合和连接。所有相关的接口和类都是部分生成的,我可以使用部分接口和类轻松扩展:
服务器上的
- partial interface IMyDataService
- partial class MyDataService
并在客户端
- partial interface IMyDataContext
- partial class MyDataContext
此外,框架生成的代码不会自动公开存储过程。如果您愿意,可以修改代码生成(T4文件)或将自定义方法添加到数据服务和客户端数据上下文。
在您的情况下......
根据您的意图,您可以执行以下操作:
var query =
from p in ctx.PROJECTS.AsQueryable()
.Include(“USER_PROJECTS_NAVIGATION_PROPERTY”)
where p.USER_PROJECTS_NAVIGATION_PROPERTY.RF_USER == 1
select p;
或者,如果您需要更复杂的东西,请使用上面列出的分部类将其实现为自定义方法。