如何使用Linq2Sql构建我的服务/存储库代码!

时间:2010-02-23 08:48:32

标签: c# linq-to-sql architecture

我在构建应用程序时遇到了问题。

我有以下结构,只显示了重要的方面。

namespace Domain
{
   public class Invoice
   {
     //properties
   }

public class InvoiceRepository
{
   public Linq2SqlContext context = new Linq2SqlContext();

   public IQueryable<Invoice> GetInvoices()
   {
              var query = from inv in _dbctx.Invoices orderby inv.invInvoiceDate descending select GetInvoice(inv) ;

            return query;

   }
}
public class InvoiceService()
{
   public InvoiceRepository _repository = new InvoiceRepositroy();
   public IQueryable<Invoice> GetInvoices()
   {
      return _repository.GetInvoices();
   }   

}
}

namespace MyApp
{
   public class UI
   {
      public InvoiceService _service =  new InvoiceService();
      public void FilterInvoices()
      {
            var query =
                   (
                     from i in _service.GetInvoices()
                     from s in _service.GetStatuses()
                     where i.ProjectID == _projectid &&
                           s.ID == i.Status
                     select new
                     {
                         InvoiceID = i.ID,
                         DocumentTotal = i.TotalDue.ToString(),
                         Created = i.Created,
                         WeekEnding = i.WeekEnding,
                         Status = s.staStatus
                     }
                   ).Skip(_pageIndex * _pageSize).Take(_pageSize);

      }

   }
{

所以我想从我的服务中返回IQueryable,所以我可以 从客户端代码过滤。但是我想出的问题 是FilterInvoices方法错误,“不支持 转换为sql“因为GetInvoice方法 这是我用来返回一个Invoice实体(这是 顶层的一层(LInq2 sql层)而不是Linq2sql Invoice实体。

那么如何使用这种结构从我的服务中返回IQueryable? 另外,我如何在存储库GetInvoices中对IQureyable进行排序和返回。

希望这是有道理的。

马尔科姆

3 个答案:

答案 0 :(得分:1)

linq2sql认为GetInvoice(在GetInvoices中)是一个存储过程。一种方法

var query = from inv in _dbctx.Invoices orderby inv.invInvoiceDate descending select inv ;

虽然这会传回datacontext生成的对象。如果您想填充自定义对象,可以在集合上迭代,创建自定义Invoice对象并填充它们。

foreach(var inv in query) { somelist.Add(new MyCustomInvoince() { id = inv.id ... }

编辑:以上将返回一个列表。使用以下命令返回IQueryable

return from item in query
    select GetInvoice(item);

不同之处在于,您现在正在使用Linq2Objects,该提供商将知道如何调用GetInvoice

答案 1 :(得分:1)

无法使用LTS(Linq to SQL)查询在LTS图层“顶部”构建的内容。 原因是LTS实体层是数据库内容的映射,您执行的查询“只是”被翻译成SQL。

我个人使用另一种方法来保持我的图层之间的独立性......

我创建了与我的LTS entites匹配的接口,并使用 Cast&lt;&gt;()方法让我的存储库返回接口而不是具体实现。

效果很好。

你需要扩展基础实体(没有pb,因为它是一个部分类):

partial class Employee : IEmployee

您需要在您的存储库中使用此属性:

public IQueryable<IEmployee> Query
{
    get
    {
        return this._context.Employees.Cast<IEmployee>();

    }
}

基于此,您可以编写通用存储库代码,但这是另一个故事(更复杂)

答案 2 :(得分:-1)

这只是我的头脑,但你可以试试:

from i in _service.GetInvoices().AsEnumerable()