googleとstackoverflowで同様の問題を約2時間探していましたが、解決策は見つかりませんでした。IqueryOverとの結合時のNhibernate条件
私は1対多の関係を持つ2つのテーブルを持っています。
1) [Accounts]
PK Account_Id
int User_ID
2) [Temporary_Accounts]
Fk Account_Id
char IsAccepted {'1','0',null}
varchar name
そして2つのマッピングされたクラス
1) Acc
int Id;
User user;
TempAcc Temp; //cause each Account can have 0 or one TempAcc (with IsAccepted == null)
2)TempAcc
int Id;
bool IsAccepted;
string name;
私は、レコード[Temporary_Accounts]内とIsAccepted == nullのを持っているアカウントの追加情報(f.e名)で指定したuser_idのためのすべてのアカウントを表示したいです。
ので、SQLは次のようになります。
select acc.Account_Id, acc.User_Id, tempacc.Name
from Account acc left join Temporary_Account tempacc
on (acc.Account_ID = tempacc.Account_Id and tempacc.IsAccepted is null)
where (acc.User_Id = 65);
が、私のIQueryOverquery:
IQueryOver<Acc> query = (...)
query.JoinAlias(f => f.Temp,
() => Temp,
JoinType.LeftOuterJoin)
.Where(f => f.Temp.IsAccepted == null)
.And(f => f.user.id == userid);
は、このようなSQLを生成します。
select acc.Account_Id, acc.User_Id, tempacc.Name
from Accounts acc left join Temporary_Accounts tempacc
on (acc.Account_ID = tempacc.Account_Id)
where (acc.User_Id = 65 and tempacc.IsAccepted is null);
ので、私は最初の正しいよりも少ない結果を取得していますクエリ。
私は何を変更する必要がありますか、または最初のクエリの結果を得るために何ができますか?私の考えは、Temporary_AccountsテーブルからすべてのIsAccepted = nullアカウントを選択するサブクエリを持つAccountsテーブルをleftjoinすることでしたが、IqueryoverまたはIcriteriaでそれを行う方法がわかりません。
あなたは1対多、あなたのサンプルSQLは、デカルト積を生成しますAcc
間とTemp
を持っているので、私は
ありがとうございます。私は間違っているかもしれませんが、何らかの擬似内部結合を作成すると思います。それは、一時的なアカウントを持つアカウントだけを返しますが、アカウントがない場合は返されません(私も必要です)。 – Kostrzak
あなたは次のようにします: "IsAcceptedがnullのTempAccountsのエントリを持つアカウントの一覧と、TempAccountsテーブルにもエントリを持たないアカウントの一覧"? –
残念ながら、そう簡単ではありません。たとえば、user_id = 56のアカウントが20個ある場合、正確に20個のアカウントを表示したいのですが、temporary_accountsテーブルにisaccpted = nullのレコードがあるアカウントの場合、そのtemporary_accountの名前に関する情報を取得したいとします。シンプルな左結合+ 1つのAccount_Idの原因では動作しません。a)一時テーブルにレコードがありません。または、b)isAccepted = '1'を持つ1/)isAccepted = nullの0/1レコード。私の質問の最初の質問は、私が欲しいと思っていますが、IqueryOverにどのように伝えるか? – Kostrzak