2012-01-10 51 views
2

有沒有任何方法可以用本地NHibernate linq提供程序執行以下查詢?NHibernate。加入不相關的實體

var result = 
    (from e1 in Session.Query<Entity1>() 
    join e2 in Session.Query<Entity2>() on e1.SomeField equals e2.SomeField into je 
    from je2 in je.DefaultIfEmpty() 
    select new {e1.Id, e1.SomeField, je2.SomeUrelatedField}).ToList() 

目前我使用功能NHibernate 1.2與NHibernate 3.1和我得到NotImplementedException

我不想介紹e1e2之間的任何關係。按照設計,它們沒有關係,像上面這樣的查詢可以用於罕見目的。

This blog post表明它不受支持。現在呢?

回答

0

它仍然不支持。

您應該在對象之間引入關係或爲查詢使用SQL。

+0

我很驚訝,在官方跟蹤器https://nhibernate.jira.com/中,thare仍然沒有功能請求。我試着提交這個 – 2012-01-10 15:37:29

+0

看起來像NHibernate的團隊屏蔽了新問題提交:( – 2012-01-10 15:44:48

1

不使用LINQ,但可以在使用HQL時進行theta連接。

Select e1.Id, e1.SomeField, e2.SomeUnrelatedField 
from Entity1 e1, Entity2 e2 where e1.SomeField = e2.SomeField 

但是,您將無法對此進行外部連接。所以,如果這是一個要求,你將不得不使用原始SQL。

+0

)如果我沒有弄錯,存在一個解決方案,用Criteria API進行左外連接,但是我發現它是真正的核心員工。目標是加入不相關的實體。 – 2012-01-10 16:24:01

1

我不太清楚何時引入了這個功能,但現在NHibernate支持這個功能。我使用的是版本3.3.1,我的查詢與您的工作非常相似。下面的測試適用於我:

[TestFixture] 
public class NHibernateJoinUnrelatedEntitiesTest 
{ 
    private ISessionFactory sessionFactory; 

    [Test] 
    public void I_Can_Join_Unrelated_Entities() 
    { 
     // Arrange 
     ISession session = sessionFactory.OpenSession(); 

     // Act 
     var results = (
          from c in session.Query<Customer>() 
          from wal in session.Query<WebsiteActivityLog>() 
          where c.Id == wal.CustomerId 
           && c.Id == 54856 
          select new { CustomerId = c.Id, Name = c.FirstName, Address = wal.IpAddress } 
        ).ToList(); 

     // Assert 
     Assert.NotNull(results); 
    } 

    public class Customer 
    { 
     public virtual int Id { get; set; } 
     public virtual string FirstName { get; set; } 
    } 

    public class WebsiteActivityLog 
    { 
     public virtual int Id { get; set; } 
     public virtual int CustomerId { get; set; } 
     public virtual string IpAddress { get; set; } 
    } 

    public class CustomerMap : ClassMap<Customer> 
    { 
     public CustomerMap() 
     { 
      Id(x => x.Id); 
      Map(x => x.FirstName); 
     } 
    } 

    public class WebsiteActivityLogMap : ClassMap<WebsiteActivityLog> 
    { 
     public WebsiteActivityLogMap() 
     { 
      Id(x => x.Id); 
      Map(x => x.CustomerId); 
      Map(x => x.IpAddress); 
     } 
    } 
} 
+0

不錯!這真的對我有用,謝謝! – 2013-07-18 22:25:09