【发布时间】:2014-04-16 08:28:58
【问题描述】:
我正在开发基于此框架的 VS2010 解决方案:http://ntieref.codeplex.com/。
一切正常,我可以查询我的数据库(MS SQLServer 2008)并保存更改。
现在我正在尝试查询一个表(项目),将其与另一个表(项目-用户关联)连接起来,并通过键(用户键)进行过滤,如下所示:
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;
我做错了吗?
还有其他方法可以让一个表在与另一个表的连接中过滤吗?
这是两个表的定义: (其中 Entity 是 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 模板吗?
谢谢!
罗伯托
【问题讨论】:
-
能否删除扩展方法
AsQueryable()。并尝试。 -
为什么需要调用.AsQueryable()
-
感谢您的回答。我认为 N 层实体框架需要 .AsQueryable() 才能调用远程 Web 服务。它用于示例和库文档中:link
标签: c# entity-framework n-tier-architecture