8

私は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;}
}

最終的には、たとえば、「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ではなくORを生成するように、クエリを調整するにはどうすればよいですか?

ご協力いただきありがとうございます。

4

2 に答える 2

5

これを試してください、うまくいくかもしれません。

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))
            );
于 2010-04-23T10:12:19.327 に答える
2

Expression.Or(criteria1, criteria2) を使用して2つの基準を組み合わせる必要があります

詳細はこちら: http://devlicio.us/blogs/derik_whittaker/archive/2009/04/21/creating-a-nested-or-statement-with-nhibernate-using-the-criteria-convention.aspx

うーん、次のようになると思います (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))
        );

しかし、あなたがすべてを OR したいと思っていたことに気づきませんでした。その場合、BuggyDigger が示したように、これらの基準を論理和に追加するのがおそらく最善の方法です。

于 2010-04-22T15:18:32.017 に答える