Nhibernate t正在工作,我在类似场景中多次使用它。我可以用粗体字询问什么是aliasToDeepTransformer?@Rippo它是一个IResultTransformer实现,可以设置嵌套对象的属性。我现在可能会使用地图绘制器或其他方法来完成这项工作。您好,谢谢
Nhibernate t正在工作,我在类似场景中多次使用它。我可以用粗体字询问什么是aliasToDeepTransformer?@Rippo它是一个IResultTransformer实现,可以设置嵌套对象的属性。我现在可能会使用地图绘制器或其他方法来完成这项工作。您好,谢谢,nhibernate,c#-4.0,fluent-nhibernate,Nhibernate,C# 4.0,Fluent Nhibernate,t正在工作,我在类似场景中多次使用它。我可以用粗体字询问什么是aliasToDeepTransformer?@Rippo它是一个IResultTransformer实现,可以设置嵌套对象的属性。我现在可能会使用地图绘制器或其他方法来完成这项工作。您好,谢谢您的回复。查询会比另一个primaryaddress对象更快吗?我想会的,但你的想法是什么请检查更新的查询。我必须遍历所有地址来填充primaryaddress1、primarycity和state字段。这个循环使操作变慢了。有更好的方法吗?@
t正在工作,我在类似场景中多次使用它。我可以用粗体字询问什么是
aliasToDeepTransformer
?@Rippo它是一个IResultTransformer实现,可以设置嵌套对象的属性。我现在可能会使用地图绘制器或其他方法来完成这项工作。您好,谢谢您的回复。查询会比另一个primaryaddress对象更快吗?我想会的,但你的想法是什么请检查更新的查询。我必须遍历所有地址来填充primaryaddress1、primarycity和state字段。这个循环使操作变慢了。有更好的方法吗?@JamieIde我已经用nhibernate查询而不是fluent nhibernate更新了查询。这是工作,但我希望是可以写流利的nhibernate查询与项目一致。。
public class Customer
{
public Customer()
{
Addressess = new List<Address>();
}
public virtual int CustomerID { get; set; }
public virtual int? BranchID { get; set; }
public virtual int? CustTypeID { get; set; }
public virtual string CompanyName { get; set; }
public virtual string Prefix { get; set; }
public virtual string FirstName { get; set; }
public virtual string MiddleName { get; set; }
public virtual string LastName { get; set; }
public virtual string PrimaryAddress1 { get; set; }
public virtual string PrimaryCity { get; set; }
public virtual List<Address> Addresses { get; set; }
}
public class Address
{
public Address()
{
}
public virtual int LocationID { get; set; }
public virtual int? CustomerID { get; set; }
public virtual string LocationName { get; set; }
public virtual string Address1 { get; set; }
public virtual string Address2 { get; set; }
public virtual string Address3 { get; set; }
public virtual string City { get; set; }
public virtual bool Primary { get; set; }
}
public TblCustomerMap()
{
Table("tblCustomers");
LazyLoad();
Id(x => x.CustomerID).GeneratedBy.Identity().Column("CustomerID");
Map(x => x.ProfileID).Column("ProfileID");
Map(x => x.BranchID).Column("BranchID");
Map(x => x.DateEntered).Column("DateEntered");
Map(x => x.DateTerminated).Column("DateTerminated");
Map(x => x.CustTypeID).Column("CustTypeID");
Map(x => x.CompanyName).Column("CompanyName").Not.Nullable().Length(50);
Map(x => x.Prefix).Column("Prefix").Not.Nullable().Length(50);
Map(x => x.FirstName).Column("FirstName").Not.Nullable().Length(50);
Map(x => x.MiddleName).Column("MiddleName").Not.Nullable().Length(50);
Map(x => x.LastName).Column("LastName").Not.Nullable().Length(50);
HasMany(x => x.Address).KeyColumn("CustomerID");
Map(x => x.PrimaryAddress1).Column("PrimaryAddress1") // from table tbladdress where address is primary and get data from address1 column
Map(x => x.PrimaryCity).Column("PrimaryCity") // from table tbladdress where address is primary and get data from city column
}
var query = session
.QueryOver<Customer>(() => customer)
.JoinQueryOver(() => customer.Addresses, () => address)
.Where(() => address.Primary)
.List();
foreach (var customer1 in query)
{
customer1.PrimaryAddress1 = customer1.Addresses[0].Address1;
customer1.PrimaryCity = customer1.Addresses[0].City;
customer1.PrimaryState = customer1.Addresses[0].StateOrProvince;
}
var query = session.Query<Customer>()
.SelectMany(c => c.Addresses,
(c, a) => new {c, a})
.Where(cust => cust.a.Primary)
.Select(item => new CustomerView()
{
CustomerID = item.c.CustomerID,
CompanyName= item.c.CompanyName,
FirstName= item.c.FirstName,
LastName=item.c.LastName,
Address1=item.a.Address1,
Address2=item.a.Address2,
Address3= item.a.Address3,
City= item.a.City,
StateOrProvince= item.a.StateOrProvince
});
return query.ToList();
SELECT ***columns*** FROM [tbladdress] WHERE Primary = true
Join("[viewPrimaryAddress]",
{
m.Fetch.Join();
m.KeyColumn("CustomerID");
m.Map(t => t.PrimaryAddress1).Column("PrimaryAddress1");
m.Map(t => t.PrimaryCity).Column("PrimaryCity");
});
<class name="PrimaryAddress" ... where="Primary = true" >
public class PrimaryAddress
{
public virtual Customer Customer { get; set; }
public virtual string Address { get; set; }
public virtual string City { get; set; }
}
public TblPrimaryAddressMap()
{
Table("tbladdress");
LazyLoad();
Where("Primary = 1");
// Id as AddressId
References(x => x.Customer).Column("CustomerID");
Map(x => x.Address).Column("PrimaryAddress1")
Map(x => x.PrimaryCity).Column("PrimaryCity")
}
public class Customer
{
..
public virtual PrimaryAddress PrimaryAddress { get; set; }
customer.PrimaryAddress.Address
customer.PrimaryAddress.City
internal static QueryOver<Company> GetCompanyDtoQuery()
{
Address addr = null;
CompanyDto dto = null;
var query = QueryOver.Of<Company>()
.Left.JoinAlias(c => c.Addresses, () => addr)
.SelectList(list =>
{
list.Select(c => c.CompanyId).WithAlias(() => dto.CompanyId)
list.Select(a -> addr.AddressId).WithAlias(() => dto.AddressId
return list;
})
.Where(a => addr.AddressId == null || addr.IsPrimaryAddress)
.TransformUsing(new AliasToDtoDeepTransformer<CompanyDto>("PrimaryAddress"));
return query;
}
var target = (from c in session.Query<Company>()
from a in c.Addresses
where a.IsPrimaryAddress
select new
{
c.CompanyId,
a.Address1
})
.Take(10).ToList();
Assert.IsTrue(target.Any());
var target = session.QueryOver<Company>()
.Fetch(c => c.Addresses).Eager
.Take(10).List();
Assert.IsTrue(target.Any());