【发布时间】:2015-03-18 06:11:10
【问题描述】:
我遇到了一个 SQL 查询(使用 NHibernate 4)。
我有 2 个具有多对多关系的表(Client 和 Technology),因此我创建了一个名为 ClientTechnology 的联结表。
我正在尝试检索所有可用的技术(非自定义)以及所有可用的技术(自定义)并属于给定的客户。
在 SQL 中是这样的语句:
declare @clientId int = 1
select * from
[dbo].[Technology] t
where t.IsCustom = 0
union
select t.* from
[dbo].[Technology] t
join [dbo].[ClientTechnology] ct
on ct.TechnologyId = t.Id
where t.IsCustom = 1 and ct.ClientId = @clientId
我的 Fluent Mapping for Client 表是:
public ClientMap()
{
Id(x => x.Id);
Map(x => x.Name).Not.Nullable();
}
对于技术表是:
public TechnologyMap()
{
Id(x => x.Id);
Map(x => x.Name).Not.Nullable();
Map(x => x.IsCustom).Not.Nullable();
HasMany(x => x.ClientTechnologies)
.Access.ReadOnlyPropertyThroughCamelCaseField(Prefix.Underscore)
.Table("ClientTechnology")
.KeyColumn("TechnologyId");
}
最后是联结表 ClientTechnology:
public ClientTechnologyMap()
{
Id(x => x.Id);
Map(x => x.Alias).Not.Nullable();
Map(x => x.IsDeleted).Not.Nullable();
References<Client>(x => x.Client, "ClientId");
References<Technology>(x => x.Technology, "TechnologyId");
}
我愿意接受不同的选择来实现这一目标。 假设我有一个可用的 Client 对象(ClientId) 我可以首先检索符合 IsCustom = false 要求的技术列表 然后检索符合要求的技术列表 IsCustom = true AND "提供的客户是此自定义技术的所有者"
在必须返回 Technology 可枚举的方法 public IEnumerable<Technology> GetTechnologies(Client client) 中(给定一个客户端实例)
我尝试了以下方法来检索 globalTechnologies:
var globalTechnologies = _session.QueryOver<Technology>()
.WhereNot(x => x.IsDeleted)
.WhereNot(x => x.IsCustom)
.List();
对于拥有者为客户的 customTechnologies,以下内容:
Technology technology = null;
ClientTechnology clientTechnology = null;
var customTechnologies = _session.QueryOver<Technology>(() => technology)
.JoinAlias(() => technology.ClientTechnologies, () => clientTechnology)
.WhereNot(x => x.IsDeleted)
.Where(x => x.IsCustom)
.Where(clientTechnology.Client == client) //this doesn't compile
.List();
但我不知道如何访问联结表(已连接)以应用限制。
任何帮助将不胜感激。谢谢。
【问题讨论】:
标签: c# join nhibernate fluent-nhibernate queryover