NHibernate. Присоединяйтесь к несвязанным лицам - PullRequest
2 голосов
/ 10 января 2012

Есть ли способ выполнить следующий запрос с нативным провайдером 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

Я не хочу вводить какую-либо связь между e1 и e2. По замыслу они не имеют отношения, и запрос, подобный приведенному выше, можно использовать в редких целях.

В этом блоге говорится, что оно не поддерживается. А сейчас?

Ответы [ 3 ]

2 голосов
/ 11 июля 2013

Я не совсем уверен, когда это было введено, но теперь это поддерживается 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 голос
/ 10 января 2012

Не используется LINQ, но вы можете выполнять тэта-соединения при использовании HQL.

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

Однако вы не сможете выполнять внешние соединения с этим. Так что, если это требование, вам придется использовать сырой SQL.

0 голосов
/ 10 января 2012

Это все еще не поддерживается.

Вы должны либо ввести отношение между объектами, либо использовать SQL для запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...