NHibernateはを使用して、データベースに対する照会のための仕様のパターン

StackOverflow https://stackoverflow.com/questions/844097

  •  20-08-2019
  •  | 
  •  

質問

どのようにNHibernateはを使用してデータベースを照会するための仕様のパターンを実装するのですか?(LINQなしNHibernateのに).Iは仕様パターンについて多くを読みますが、それらのほとんどは、検証および問合せメモリーコレクションオブジェクトについてでした。

限り私はこのような仕様のインターフェイスにDetachedCriteriaをを使用して知っているように、

ベストの方法。

interface ISpecification<T> {

 bool IsSatisfiedBy(T object);

 DetachedCriteria CreateCriteria();

}

任意の代替またはこれを行うには良い方法はありますか?

役に立ちましたか?

解決

これは、より良い必要はありませんが、代替することができます。

interface ISpecification<T> 
{
   bool IsSatisfiedBy(T object);

   Expression<Func<T, bool>> Predicate { get; }
}

簡単にLINQ(NHibernateの)とメモリのコレクションを超える使用する。

他のヒント

私はSystem.Linq.IQueryableリストのために働く、単純な拡張方法や仕様のパターンを使用して、これを実現します。

public interface IFilter<in T>
{
    bool MatchFilter(T o);
}

public static class FilterExtension
{
    public static IQueryable<T> Filter<T>(this IQueryable<T> query, IFilter<T> filter)
    {
        return query.Where(x => filter.MatchFilter(x));
    }
}

簡単な例クラスとのIFilter実装ます:

public class Organization
{
    public string Name { get; set; }
    public string Code { get; set; }
    public Address Address { get; set; }


    public Organization(string name, string code, string city, string country)
    {
        Name = name;
        Code = code;
        Address = new Address(city, country);
    }

}

public class Address
{
    public Address(string city, string country)
    {
        City = city;
        Country = country;
    }

    public string City { get; set; }
    public string Country { get; set; }
}

public class GenericOrganizationFilter : IFilter<Organization>
{
    public string FilterString { get; set; }

    public GenericOrganizationFilter(string filterString)
    {
        FilterString = filterString;
    }

    public bool MatchFilter(Organization o)
    {
        return
            (o.Name != null && o.Name.Contains(FilterString)) ||
            (o.Code != null && o.Code.Contains(FilterString)) ||
            (o.Address != null && o.Address.City != null && o.Address.City.Contains(FilterString)) || 
            (o.Address != null && o.Address.Country != null && o.Address.Country.Contains(FilterString));
    }
}

使用方法:

IFilter<Organization> filter = new GenericOrganizationFilter("search string");
//Assuming queryable is an instance of IQueryable<Organization>. 
IQueryable<Organization> filtered = queryable.Filter(filter);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top