문제

nhibernate를 사용하여 데이터베이스를 쿼리하기위한 사양 패턴 (linq에서 nhibernate ~ nhibernate없이)을 구현하려면 어떻게합니까? 사양 패턴에 대해 많이 읽었지만 대부분은 메모리 수집 객체를 검증하고 쿼리하는 것에 관한 것입니다.

이와 같은 사양 인터페이스에서 DetachedCriteria를 사용하는 한 가장 좋은 방법.

interface ISpecification<T> {

 bool IsSatisfiedBy(T object);

 DetachedCriteria CreateCriteria();

}

이 작업을 수행하는 대안 또는 더 나은 방법이 있습니까?

도움이 되었습니까?

해결책

이것은 Nessary가 더 좋지 않지만 대안이 될 수 있습니다.

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