Linq NHibernate。加入无关实体

Linq NHibernate。加入无关实体,linq,nhibernate,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,

是否有任何方法可以使用本机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()
var结果=
(来自Session.Query()中的e1)
将e1.SomeField上的Session.Query()中的e2连接到je中等于e2.SomeField
来自je.DefaultIfEmpty()中的je2
选择new{e1.Id,e1.SomeField,je2.SomeUrelatedField}).ToList()
目前我正在使用Fluent NHibernate 1.2和NHibernate 3.1,我得到了
NotImplementedException

我不想介绍
e1
e2
之间的任何关系。通过设计,它们没有关系,像上面这样的查询可以用于很少的用途


表示它不受支持。现在呢?

它仍然不受支持


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

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

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

但是,您将无法使用此进行外部联接。因此,如果这是一个要求,那么您必须使用原始SQL。

我不太确定这是什么时候引入的,但现在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 );
        }
    }
}
[TestFixture]
公共类NHibernateJoinUnrelatedentiesTest
{
私人ISessionFactory sessionFactory;
[测试]
public void I\u Can\u Join\u Unrelated\u Entities()
{
//安排
ISession session=sessionFactory.OpenSession();
//表演
风险值结果=(
来自会话中的c.Query()
来自会话中的wal.Query()
其中c.Id==wal.CustomerId
&&c.Id==54856
选择新建{CustomerId=c.Id,Name=c.FirstName,Address=wal.IpAddress}
).ToList();
//断言
Assert.NotNull(结果);
}
公共类客户
{
公共虚拟整数Id{get;set;}
公共虚拟字符串FirstName{get;set;}
}
公共类网站活动日志
{
公共虚拟整数Id{get;set;}
公共虚拟int CustomerId{get;set;}
公共虚拟字符串IpAddress{get;set;}
}
公共类CustomerMap:ClassMap
{
公共客户映射()
{
Id(x=>x.Id);
Map(x=>x.FirstName);
}
}
公共类网站ActivityLogMap:ClassMap
{
公共网站ActivityLogMap()
{
Id(x=>x.Id);
Map(x=>x.CustomerId);
Map(x=>x.IpAddress);
}
}
}

我很惊讶,在官方的tracker中,thare仍然没有这方面的功能要求。我将尝试提交这篇文章,看起来NHibernate的团队阻止了新问题的提交:(如果我没有弄错的话,存在一个使用Criteria API的左外连接解决方案,但我发现它是真正的核心员工。无论如何,主要目标是连接不相关的实体。