使用NHibernate Linq查询建立内部联接时遇到问题

使用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

使用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 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;