c# – 存储库方法与扩展IQueryable

我有存储库(例如ContactRepository,UserRepository等),它封装了对域模型的数据访问。

当我在寻找数据时,例如

>找到名字的联系人
从XYZ开始
>生日之后的联系人
1960年

(等等),

我开始实现存储库方法,如FirstNameStartsWith(string prefix)和YoungerThanBirthYear(int year),基本上遵循了很多例子。

然后我遇到了一个问题 – 如果我必须结合多个搜索?我的每个存储库搜索方法,如上所述,只返回一组有限的实际域对象。为了寻找更好的方式,我开始在IQueryable< T>上编写扩展方法,例如这个:

public static IQueryable<Contact> FirstNameStartsWith(
               this IQueryable<Contact> contacts, String prefix)
{
    return contacts.Where(
        contact => contact.FirstName.StartsWith(prefix));
}        

现在我可以做的事情,如

ContactRepository.GetAll().FirstNameStartsWith("tex").YoungerThanBirthYear(1960);

然而,我发现自己写的扩展方法(并发明了疯狂的类,如ContactsQueryableExtensions全部,我失去了“好的分组”通过把一切放在适当的存储库。

这是真的做到这一点,还是有更好的方法来实现同样的目标?

@Alex – 我知道这是一个老问题,但我会做的是让Repository做真的很简单的东西。这意味着,获取表或视图的所有记录。

然后,在服务层(你使用一个n层的解决方案,对吧?)我会处理所有的“特殊”查询的东西。

好的,例子时间。

存储库层

ContactRepository.cs

public IQueryable<Contact> GetContacts()
{
    return (from q in SqlContext.Contacts
            select q).AsQueryable();
}

尼斯和简单。 SqlContext是你的EF上下文的实例。它有一个Entity上它叫联系人..这基本上是你的sql的联系人类。

这意味着,该方法基本上是做:SELECT * FROM CONTACTS …但它不是用该查询命中数据库..它只是一个查询现在。

好的..下一层.. KICK …我们去(开始任何人?)

服务层

ContactService.cs

public  ICollection<Contact> FindContacts(string name)
{
    return FindContacts(name, null)
}

public ICollection<Contact> FindContacts(string name, int? year)
{
   IQueryable<Contact> query = _contactRepository.GetContacts();

   if (!string.IsNullOrEmpty(name))
   {
       query = from q in query
               where q.FirstName.StartsWith(name)
               select q;
   }

   if (int.HasValue)
   {
       query = from q in query
               where q.Birthday.Year <= year.Value
               select q);
    }

    return (from q in query
            select q).ToList();
}

完成。

所以让我们重温。首先,我们从一个简单的“从联系人获取一切”查询开始我们。现在,如果我们提供了名称,我们可以添加一个过滤器来按名称过滤所有联系人。接下来,如果我们有一年提供,那么我们按年度过滤生日。等等。最后,我们点击DB(使用这个修改的查询),看看我们得到了什么结果。

笔记:-

>为了简单,我省略了任何依赖注入。这是强烈推荐。
>这是所有的pseduo代码。未经测试(对编译器),但你得到的想法….

外卖点

>服务层处理所有智能。这就是你决定你需要什么数据。
> Repository是一个简单的SELECT * FROM TABLE或简单的INSERT / UPDATE into TABLE。

祝你好运 :)

http://stackoverflow.com/questions/1416591/repository-methods-vs-extending-iqueryable

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 存储库方法与扩展IQueryable