複数のテーブルにわたってnhibernateクエリ
-
01-10-2019 - |
質問
私はnhibernateを使用しており、私のエンティティのすべての名前を検索し、結果をリストするクエリの書き方を理解しようとしています。簡単な例として、次のオブジェクトがあります。
public class Cat {
public string name {get; set;}
}
public class Dog {
public string name {get; set;}
}
public class Owner {
public string firstname {get; set;}
public string lastname {get; set;}
}
eventaullyたとえば、たとえばクエリを作成したいのですが、「ted」を含む名前を持つすべてのペットの飼い主、または「ted」を含む名前のペットを返します。
これが私が実行したいSQLの例です。
SELECT TOP 10 d.*, c.*, o.* FROM owners AS o
INNER JOIN dogs AS d ON o.id = d.ownerId
INNER JOIN cats AS c ON o.id = c.ownerId
WHERE o.lastname like '%ted%'
OR o.firstname like '%ted%'
OR c.name like '%ted%'
OR d.name like '%ted%'
私がこのような基準を使用してそれを行うとき:
var criteria = session.CreateCriteria<Owner>()
.Add(
Restrictions.Disjunction()
.Add(Restrictions.Like("FirstName", keyword, MatchMode.Anywhere))
.Add(Restrictions.Like("LastName", keyword, MatchMode.Anywhere))
)
.CreateCriteria("Dog").Add(Restrictions.Like("Name", keyword, MatchMode.Anywhere))
.CreateCriteria("Cat").Add(Restrictions.Like("Name", keyword, MatchMode.Anywhere));
return criteria.List<Owner>();
次のクエリが生成されます。
SELECT TOP 10 d.*, c.*, o.* FROM owners AS o
INNER JOIN dogs AS d ON o.id = d.ownerId
INNER JOIN cats AS c ON o.id = c.ownerId
WHERE o.lastname like '%ted%'
OR o.firstname like '%ted%'
AND d.name like '%ted%'
AND c.name like '%ted%'
.CreateCriteria( "dog")と.createCriteria( "cat")がandの代わりに生成されるようにクエリを調整するにはどうすればよいですか?
ご協力いただきありがとうございます。
解決
これを試してみてください、それはうまくいくかもしれません。
var criteria = session.CreateCriteria<Owner>()
.CreateAlias("Dog", "d")
.CreateAlias("Cat", "c")
.Add(
Restrictions.Disjunction()
.Add(Restrictions.Like("FirstName", keyword, MatchMode.Anywhere))
.Add(Restrictions.Like("LastName", keyword, MatchMode.Anywhere))
.Add(Restrictions.Like("c.Name", keyword, MatchMode.Anywhere))
.Add(Restrictions.Like("d.Name", keyword, MatchMode.Anywhere))
);
他のヒント
式を使用して2つの基準を組み合わせる必要があります。
うーん、このように見えると思います(Buggydiggerのコードから少し借りた)
var criteria = session.CreateCriteria<Owner>()
.CreateAlias("Dog", "d")
.CreateAlias("Cat", "c")
.Add(Expression.Or(Expression.Like("c.Name", keyword, MatchMode.Anywhere)
, Expression.Like("d.Name", keyword, MatchMode.Anywhere))
);
しかし、私はあなたが望んでいることやすべてに気づきませんでした。その場合、Buggydiggerが示したように、これらの基準を分離に追加することは、おそらく道です。
所属していません StackOverflow