NHibernate的。加入不相关的实体

时间:2012-01-10 15:19:59

标签: linq nhibernate

有没有办法用本机NHibernate linq提供程序执行以下查询?

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()

目前我正在使用Fluent NHibernate 1.2和NHibernate 3.1,我得到NotImplementedException

我不想在e1e2之间引入任何关系。根据设计,它们没有关系,上面的查询可以用于罕见的目的。

This blog post表示它不受支持。那现在呢?

3 个答案:

答案 0 :(得分:2)

我不太确定这是什么时候引入的,但现在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 );
        }
    }
}

答案 1 :(得分:1)

不使用LINQ,但在使用HQL时可以进行theta连接。

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

但是,您将无法使用此连接进行外连接。因此,如果这是一项要求,您将不得不使用原始SQL。

答案 2 :(得分:0)

它仍然不受支持。

您应该在对象之间引入关系或使用SQL进行查询。