有没有办法用本机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
之间引入任何关系。根据设计,它们没有关系,上面的查询可以用于罕见的目的。
This blog post表示它不受支持。那现在呢?
答案 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进行查询。