でのLINQを使用するときに参加する基本的に、私は重複につながるこのlinq-to-nhibernate-produces-unnecessary-joins重複や不要なNHibernateは
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();
でのLINQプロバイダの同じ問題を渡ったが、これらが結合して生成された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のパフォーマンスにも影響します。 NHibernateは3.2にアップデート1
INNER JOIN A fwbcompeti1_
ON fwbcompeti0_.competitionseasonid = fwbcompeti1_.competitionseasonid
INNER JOIN A fwbcompeti2_
ON fwbcompeti0_.competitionseasonid = fwbcompeti2_.competitionseasonid
は、この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を交換する。しかし、それはperformenceの問題を紹介します。あなたが最初に必要とする画像は、現在のシーズンの2行のデータを返す必要があります。代替ソリューション(CurrentSeason = true)を使用すると、システムは100行のデータを返します。 – ValidfroM
選択部分の特定のフィールドに対して返す値の変更返される行の数を変更します。どういう意味ですか? –
Panagiotisありがとう、今私はあなたのポイントを持って、それを試してみました。 Unfournately、それは同じSQLを与えた。 QueryOver APIに切り替える必要があると思う。 – ValidfroM