基本上我越过LINQ提供的同样的问题,在此linq-to-nhibernate-produces-unnecessary-joins重复的和不必要的NHibernate的使用LINQ时加入
List<Competitions> dtoCompetitions;
dtoCompetitions = (from compset in session.Query<FWBCompetitionSet>()
where compset.HeadLine == true
&& compset.A.B.CurrentSeason == true
select (new Competitions
{
CompetitionSetID = compset.CompetitionSetID,
Name = compset.Name,
Description = compset.Description,
Area = compset.Area,
Type = compset.Type,
CurrentSeason = compset.A.B.CurrentSeason,
StartDate = compset.StartDate
}
)).ToList();
导致重复在其生成的SQL加入
SELECT fwbcompeti0_.competitionsetid AS col_0_0_,
fwbcompeti0_.name AS col_1_0_,
fwbcompeti0_.DESCRIPTION AS col_2_0_,
fwbcompeti0_.area AS col_3_0_,
fwbcompeti0_.TYPE AS col_4_0_,
fwbseason3_.currentseason AS col_5_0_,
fwbcompeti0_.startdate AS col_6_0_
FROM fwbcompetitionset fwbcompeti0_
INNER JOIN A fwbcompeti1_
ON fwbcompeti0_.competitionseasonid = fwbcompeti1_.competitionseasonid
INNER JOIN A fwbcompeti2_
ON fwbcompeti0_.competitionseasonid = fwbcompeti2_.competitionseasonid
INNER JOIN B fwbseason3_
ON fwbcompeti2_.seasonid = fwbseason3_.seasonid
WHERE fwbcompeti0_.headline = @p0
AND fwbseason3_.currentseason = @p1
通知这些连接,它们是完全重复的,也影响我的SQL Server的性能。
INNER JOIN A fwbcompeti1_
ON fwbcompeti0_.competitionseasonid = fwbcompeti1_.competitionseasonid
INNER JOIN A fwbcompeti2_
ON fwbcompeti0_.competitionseasonid = fwbcompeti2_.competitionseasonid
UPDATE1
在NHibernate的3.2,这LINQ错误仍然是有效的,我无法找到一个简单合理的LINQ的解决方案。 所以我用QueryOver + JoinAlias + TransformUsing完成这个工作,对我来说很完美。
FWBCompetitionSet compset = null;
FWBCompetitionSeason compseason = null;
FWBSeason season = null;
IList<Competitions> dtoCompetitions;
dtoCompetitions = session.QueryOver<FWBCompetitionSet>(() => compset)
.JoinAlias(() => compset.FWBCompetitionSeason,() => compseason)
.JoinAlias(() => compseason.FWBSeason,() => season)
.Where(() => compset.HeadLine == true)
.And(() => season.CurrentSeason == true)
.SelectList(
list => list
.Select(c => c.CompetitionSetID).WithAlias(() => compset.CompetitionSetID)
.Select(c => c.Name).WithAlias(() => compset.Name)
.Select(c => c.Description).WithAlias(() => compset.Description)
.Select(c => c.Area).WithAlias(() => compset.Area)
.Select(c => c.Type).WithAlias(() => compset.Type)
.Select(c => season.CurrentSeason).WithAlias(() => season.CurrentSeason)
.Select(c => c.StartDate).WithAlias(() => compset.StartDate)
)
.TransformUsing(Transformers.AliasToBean<Competitions>())
.List<Competitions>();
替换值compset.A.B.CurrentSeason但它会引入性能自动问题。 Image您原本只需要返回当前季节的2行数据,通过使用替代解决方案(CurrentSeason = true,从选择部分),系统将返回hundredes数据行 – ValidfroM 2012-02-14 14:47:19
更改您为选择部分中的特定字段返回的值不会更改返回的行数。你什么意思? – 2012-02-14 15:23:40
谢谢Panagiotis,现在我明白了你的观点并试了一试。不幸的是,它给出了相同的SQL。认为我将不得不切换到QueryOver API。 – ValidfroM 2012-02-15 09:10:27