Linq NHibernate。加入无关实体
是否有任何方法可以使用本机NHibernate linq提供程序执行以下查询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,
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的左外连接解决方案,但我发现它是真正的核心员工。无论如何,主要目标是连接不相关的实体。