我在构建应用程序时遇到了问题。
我有以下结构,只显示了重要的方面。
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进行排序和返回。
希望这是有道理的。
马尔科姆
答案 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()