مواصفات لنمط الاستعلام ضد قاعدة البيانات باستخدام NHibernate

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

  •  20-08-2019
  •  | 
  •  

سؤال

وكيف يمكنك تطبيق المواصفات نمط الاستعلام عن قاعدة بيانات باستخدام NHibernate؟ (بدون LINQ إلى NHibernate). أنا قرأت الكثير عن مواصفات نمط ولكن معظمها كان حول الكائنات جمع التحقق والاستعلام عن الذاكرة.

وأفضل طريقة بقدر ما أعرف باستخدام 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));
    }
}

والطبقات سبيل المثال بسيط وتنفيذ يفيلتر:

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