Expression.Disjunction() 内的 CreateCriteria 流畅的 nhibernate

发布于 2024-08-20 07:26:50 字数 900 浏览 4 评论 0原文

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));

这返回“名称如%foo%和slovenianName如%foo%和名称如%foo%和slovenianName如%foo%”,

但我想得到“名称如%foo%或slovenianName如%foo%或名称如%foo % 或 slovenianName like %foo%"

我可以使用 Expression.Disjunction() 进行 OR 但我有问题,我不能在 Expression.Disjunction() 中使用 CreateCriteria。有人可以告诉我如何一起使用 OR 和 CreateCriteria 吗?

问候

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));

This return "name like %foo% and slovenianName like %foo% and name like %foo% and slovenianName like %foo%"

but i would like to get "name like %foo% or slovenianName like %foo% or name like %foo% or slovenianName like %foo%"

i can use Expression.Disjunction() for OR but i have problem that i can not use CreateCriteria inside Expression.Disjunction(). Can someone tell me how can i use OR and CreateCriteria together?

Regards

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

这样的小城市 2024-08-27 07:26:50

在 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; }
}

Use CreateAlias outside the Disjunction().

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();

The corresponding entites are below. Hopefully they resemble yours.

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; }
}
沙与沫 2024-08-27 07:26:50

上面的例子效果很好,因为其他两个类都是 Property 类的构成。

如果按照这个顺序就不行。

类属性{
公共虚拟int Id { 得到;放; }
publice 虚拟字符串名称 { get;放;}
公共虚拟城市city{get; set;} //多对一
}

城市类 {
公共虚拟int Id { 得到;放; }
公共虚拟字符串名称{ get;放; }
公共虚拟国家country { get;放; } //多对一
}

类国家 {
公共虚拟int Id { 得到;放; }
公共虚拟字符串名称{ get;放; }
}

Above example works good because both of othere classes are the constitutions of Property class.

If it is in this order it doesn't work.

class Property{
public virtual int Id { get; set; }
publice virtual string name { get; set;}
Public virtual City city {get; set;} //many to one
}

class City {
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual country country { get; set; } //many to one
}

class Country {
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文