使用NHibernate Linq查询建立内部联接时遇到问题
使用NHibernate 3.3.1.400,我在使用NHibernate的Linq提供程序表达简单SQL语句时遇到问题 我的域模型如下所示:使用NHibernate Linq查询建立内部联接时遇到问题,nhibernate,linq-to-nhibernate,Nhibernate,Linq To Nhibernate,使用NHibernate 3.3.1.400,我在使用NHibernate的Linq提供程序表达简单SQL语句时遇到问题 我的域模型如下所示: public class Site { public virtual Guid Id {get; set;} public virtual string Name {get; set;} } // a site has many filers public class Filer { public virtual Guid Id {get
public class Site
{
public virtual Guid Id {get; set;}
public virtual string Name {get; set;}
}
// a site has many filers
public class Filer
{
public virtual Guid Id {get set;}
public virtual Site Site {get; set;}
public virtual string Name {get; set;}
}
// a filer has many filings
public class Filing
{
public virtual Guid Id {get set;}
public virtual Filer Filer {get; set;}
public virtual DateTime FilingDate {get; set;}
}
//a filing has many items
public class Item
{
public virtual Guid Id {get set;}
public virtual Filing Filing {get; set;}
public virtual DateTime Date {get; set;}
public virtual decimal Amount {get; set;}
}
public class SearchName
{
public virtual Guid Id {get set;}
public virtual string Name {get; set;}
}
// there are potentially many NameLink objects tied to a single search name
public abstract class NameLink
{
public virtual Guid Id {get set;}
public virtual SearchName SearchName {get; set;}
}
public class NameLinkToFiler: NameLink
{
public virtual Filer Filer {get; set;}
}
public class NameLinkToItem: NameLink
{
public virtual Item Item {get; set;}
}
我的查询应该返回匹配项元素的列表:
var query = session.Query<Item>()
.Where(x => x.Filing.Filer.Site == mySite);
…但我不想丢失这种查询的编译时检查
谢谢。显然,答案是不要使用lambda语法 这很好:
query = from t in parentItemQuery
join l in Session.Query<NameLinkToFiler>() on t.Filing.Filer.Id equals l.Filer.Id
join n in Session.Query<SearchName>() on l.SearchName.Id equals n.Id
where sn.Contains(request.FilerName)
select t;
query=来自parentItemQuery中的t
在t.Filer.Id上的Session.Query()中加入l等于l.Filer.Id
在l.SearchName.Id上的Session.Query()中加入n等于n.Id
其中序号包含(request.FilerName)
选择t;
@RadimKöhler-嘿,我是一个喜欢分享的人…;)说真的,我很喜欢你做的事。这是鼓舞人心的。。。我也在考虑更密集的全文使用。不错;)
select filer.Name, filing.FilingDate, filer.Name, item.Date, item.Amount
from Search_Name searchNameForFiler, Search_Name searchNameForItem, Name_Link_Filer nameLinkFiler,
Name_Link_Item nameLinkItem, Item item, Filing filing, Filer filer, Site s
where
contains(searchNameForFiler.Name, :filerName) and searchNameForFiler.Id = nameLinkFiler.SearchNameId and nameLinkFiler.FilerId = filer.Id and
contains(searchNameForItem.Name, :itemName) and searchNameForItem.Id = nameLinkItem.SearchNameId and nameLinkItem.ItemId = item.Id
and item.FilingId = filing.Id
and filing.FilerId = filer.Id
and filing.SiteId = :site
query = from t in parentItemQuery
join l in Session.Query<NameLinkToFiler>() on t.Filing.Filer.Id equals l.Filer.Id
join n in Session.Query<SearchName>() on l.SearchName.Id equals n.Id
where sn.Contains(request.FilerName)
select t;