我需要使用NHibernate Queryover加入3个表 ,但我不能让它工作。有什么建议吗?
我使用了这段代码 http://www.d80.co.uk/post/2011/02/20/Linq-to-NHibernate-Tutorial.aspx
NHibernate代码
namespace SimpleNHibernateClient.ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
ReadALL();
Console.ReadKey();
}
private static Make ReadALL()
{
using (var session = NHibernateHelper.OpenSession())
{
var makeQuery = session.QueryOver<Make>()
.Where(_ => _.Name == _.Name)
.List()
foreach (var m in makeQuery)
{
Console.WriteLine("Name: " + m.Name);
Console.WriteLine("Description: " + m.Description); //Dont Work
}
return null;
}
}
}
public class Car
{
public virtual int Id { get; set; }
public virtual string Title { get; set; }
public virtual string Description { get; set; }
public virtual Make Make { get; set; }
public virtual Model Model { get; set; }
}
public class Make
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<Model> Models { get; set; }
}
public class Model
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual Make Make { get; set; }
}
}
namespace SimpleNHibernateClient.ConsoleApplication
{
public class CarMap : ClassMap<Car>
{
public CarMap()
{
Id(x => x.Id);
Map(x => x.Title);
Map(x => x.Description);
References(x => x.Make).Column("MakeId");
References(x => x.Model).Column("ModelId");
Table("Car");
}
}
public class MakeMap : ClassMap<Make>
{
public MakeMap()
{
Id(x => x.Id);
Map(x => x.Name);
HasMany(x => x.Models)
.KeyColumn("MakeId");
Table("Make");
}
}
public class ModelMap : ClassMap<Model>
{
public ModelMap()
{
Id(x => x.Id);
Map(x => x.Name);
References(x => x.Make)
.Column("MakeId");
Table("Model");
}
}
namespace SimpleNHibernateClient.ConsoleApplication
{
public class NHibernateHelper
{
private static ISessionFactory _sessionFactory;
private static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
InitializeSessionFactory();
return _sessionFactory;
}
}
private static void InitializeSessionFactory()
{
_sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008
.ConnectionString(
@"Server=localhost;Database=SimpleNHibernate;Trusted_Connection=True;")
)
.Mappings(m =>
m.FluentMappings
.AddFromAssemblyOf<Car>())
.BuildSessionFactory();
}
public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}
}
}
SQL查询
SELECT * FROM Make INNER JOIN Model ON Make.Id = Model.MakeId
INNER JOIN Car ON Make.Id = Car.MakeId AND Model.Id = Car.ModelId
答案 0 :(得分:0)
你不应该使用清单:
IList<Make> makeQuery = session.QueryOver<Make>()
.Where(_ => _.Name == _.Name)
.List()
答案 1 :(得分:0)
这将为您提供一个品牌的所有汽车。如果你想要所有的车明显省略。这与SQL给你的相同。
Car car = null;
Make make = null;
Model model = null;
List<Car> cars =
session
.QueryOver<Car>(() => car)
.JoinAlias(() => car.Make, () => make)
.JoinAlias(() => car.Model, () => model)
.Where(() => make.Name == makeName)
.List<Car>();
问题是你想做什么?
如果你想获得一个包含所有模型和汽车的Make对象实例,那么显然你需要在Model类中添加一个汽车列表(并考虑使用eager抓取)。我不会推荐这个。似乎实体类的作者,即域模型,想要将品牌/模型域与实体汽车的域分开。这对我来说似乎很好。如果你想要一个品牌/型号的所有汽车,你应该返回一个汽车列表,并且NH查询将只返回与结果集中的品牌/模型行数一样多的品牌/模型对象实例。
当模型类不包含汽车列表时,无法返回所有汽车的品牌:)
如果你想返回一个自定义对象,你可以使用它来创建一些自定义转换,但我宁愿重新思考我想要做的事情而不是这样做。
您可以查看projections,它们也很有用,并且有转换,但我认为,不应该用于遍历未在实体中定义的关系,例如模型 - &gt;辆。