2012-01-10 7 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は3.1と流暢NHibernateは1.2を使用していると私は私がe1e2間の任意の関係を導入したくないNotImplementedException

を取得します。設計上、彼らは関係がなく、まれにこのようなクエリを使用することができます。

This blog postはサポートされていないことを示します。今はどう?

答えて

0

まだサポートされていません。

オブジェクト間のリレーションを導入するか、クエリにSQLを使用する必要があります。

+0

私はthareがまだ正式なトラッカーhttps://nhibernate.jira.com/の機能要求ではないことに驚いています。私はこれを提出しようとします –

+0

NHibernateのチームが新しい問題の提出をブロックしたように見えます:( –

1

LINQを使用していませんが、HQLを使用するときにシータ結合を実行できます。

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

ただし、これで外部結合を実行することはできません。したがって、それが必須の場合は、未処理のSQLを使用する必要があります。

+0

私が間違っていないなら、Criteria APIとの左外部ジョインの解決策がありますが、目標は無関係のエンティティに参加することです –

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

ニース!これは本当に私のために働いた。ありがとう! –

関連する問題