1
criteriaCount.CreateCriteria(AdvertisementsProperties.City.ToString())
                .Add(Expression.Like(CitiesProperties.Name.ToString(), query, MatchMode.Anywhere))
                .Add(Expression.Like(CitiesProperties.SlovenianName.ToString(), query, MatchMode.Anywhere))
                .CreateCriteria(AdvertisementsProperties.Country.ToString())
                .Add(Expression.Like(CountriesProperties.Name.ToString(), query, MatchMode.Anywhere))
                .Add(Expression.Like(CountriesProperties.SlovenianName.ToString(), query, MatchMode.Anywhere));

これは、「name like %foo% and slovenianName like %foo% and name like %foo% and slovenianName like %foo%」を返します。

しかし、「%foo% のような名前または %foo% のような slovenianName または %foo% のような名前または %foo% のような slovenianName」を取得したいと考えています。

ORにExpression.Disjunction()を使用できますが、Expression.Disjunction()内でCreateCriteriaを使用できないという問題があります。OR と CreateCriteria を一緒に使用する方法を教えてもらえますか?

よろしく

4

2 に答える 2

3

Disjunction()の外でCreateAliasを使用します。

var result = session.CreateCriteria<Property>()
    .CreateAlias("Cities", "city")
    .CreateAlias("Countries", "country")
    .Add(Restrictions.Disjunction()
        .Add(Expression.Like("city.Name", query, MatchMode.Anywhere))
        .Add(Expression.Like("city.SlovenianNam", query, MatchMode.Anywhere))
        .Add(Expression.Like("country.Name", query, MatchMode.Anywhere))
        .Add(Expression.Like("country.SlovenianNam", query, MatchMode.Anywhere))
    ).List();

対応するエンティティは以下のとおりです。うまくいけば、彼らはあなたのものに似ています。

class Property
{
    public virtual Guid Id { get; set; }
    public virtual IList<City> Cities { set; get; }
    public virtual IList<Country> Countries { set; get; }
}

class City
{
    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string SlovenianNam{ get; set; }
}

class Country
{
    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string SlovenianNam{ get; set; }
}
于 2010-02-11T12:26:04.743 に答える
1

上記の例は、他のクラスが両方とも Property クラスの構成であるため、うまく機能します。

この順番だとうまくいきません。

クラスプロパティ{ public virtual int Id { get; 設定; }
publice 仮想文字列名 { get; set;} パブリック仮想都市 city {get;} set;} //多対1 }

class City {
public virtual int Id { get; 設定; }
パブリック仮想文字列名 { get; 設定; }
パブリック仮想国 { get; 設定; } //多対一 }

クラス 国 {
public virtual int Id { get; 設定; }
パブリック仮想文字列名 { get; 設定; }
}

于 2011-05-04T11:38:59.370 に答える