2016-06-24 12 views
1

サブクエリに関する助けが必要です。 私の問題は簡単なようですが、わかりません。nHibernateの基準におけるサブクエリ

私は3つのエンティティがあります - 企業 - 車 - 従業員

従業員が会社のリストを持っている(ただし、当社は従業員のリストを持っているdoesntのを)。 車は1社あります。

従業員がアクセスできるすべての会社からすべての車を取り出す必要があります。

データベース構造が役立つ場合があります。

会社

id |  Name  

id |  Name  

CompanyToEmployee

employee_id |  company_id  

カー

id | Name | company_id  

gmileyは、いくつかのモーラ情報を追加し、I`mを推薦したよう。

私がこれまで行ったことはあまりありません。

ICriteria consult = Session.CreateCriteria<Car>(); 

DetachedCriteria c = DetachedCriteria.For<Employee>() 
    .SetProjection(Projections.Property("Companies")) 
    .Add(Restrictions.Eq("Id", employee.Id)); 

consult.Add(Subqueries.PropertyIn("Company.Id", c)); 

しかし、それは返すものは、同じId '従業員'を持つ会社内のすべての車です。そして私はなぜそれが見えるのですか?しかし、私は自分のニーズにそれを変更することはできません。明確にする

ダムデータ:

2人の従業員があります。 "ビル・ゲイツ" e」のスティーブ・ジョブズは、ビル・ゲイツ氏は、GoogleとMicrosoftのために働く

Steve JobsがGoogleとAppleのために働く

。 。

Googleが2台あります。

"をカー3": "車1" と "2号車" を

Microsoftは1台の車を持っています

Appleには「Car 4」、「Car 5」、および「Car 6」の3台の車があります。

私が必要としているもの: すべての会社のすべての車ビル・ゲートが働いています。

この場合、車:「車1」、「車2」および「車3」。

ありがとうございます!この行で

+0

可能であれば、サンプルデータ、希望する結果の例を記入してください。最も重要なことは、これまでに試したコードのいくつかを提供していることです。人々があなたがそれに何らかの努力をしているのを見て、あなたが持っていないと言っているのではなく、あなたが持っていることを示すことは良いことです。コードが完全に間違っていることがわかっても、あなたが何を考えているのか理解するのに役立ちます。 – gmiley

+0

この宿題はありますか?データベースの設計は少し奇妙です。しかし、これに加えて、常により良いクラスデザインを持つことが可能です。このクエリーのどちらかを変更する必要はありませんが、それはもっと簡単になります。 –

+0

これは非常に簡単な方法で公開される実際のシナリオです。問題に集中する。 –

答えて

0

私は非常に単純な方法で私の問題を解決するために管理します。私はすでにユーザー企業のリストを持っているので

 foreach (var company in user.Companies) 
     { 
      companies.Add(company.Id); 
     } 

     consult.Add(Expression.In("Company.Id", companies)); 

、このdoesntのは私のパフォーマンスの問題を与えます。

0

.SetProjection(Projections.Property("Companies")) 

あなたが投影企業全体のコレクションを持っています。私はこれが実際に構文エラーなしで実行されていることを知らなかった。しかし、私はそれが実際に何をしているのか分からず、それに依存しません。

おそらく、エイリアス名を使用すると、状況がより明確になります。これを試してみてください:

var cars = Session.CreateCriteria<Car>("c"); 

var c = DetachedCriteria.For<Employee>("emp") 
    // join 
    .CreateCriteria("emp.Company", "comp") 
    // select company id 
    .SetProjection(Projections.Property("comp.id")) 
    // of all companies where the employee is working in. 
    .Add(Restrictions.Eq("emp.Id", employee.Id)); 

carCompanies.Add(Subqueries.PropertyIn("comp.Id", c)); 
+0

従業員には「会社」があります。それは会社のリストを持っています。 –

関連する問題