【问题标题】:Linq to Sql query reuseLinq to Sql 查询重用
【发布时间】:2012-07-02 09:13:18
【问题描述】:

假设我们有一个视图 V1 和 V2,声明如下:

create view V2 as
select V1.*, V2.C1, V2.C2, V2.C3
from V1
join V2 on V1.Key = V2.Key
where bla-bla

所以 V2 缩小了 V1 的结果集并添加了一些连接。 C#中有一个检索例程

IEnumerable<V1> GetData(MyFilter filter, MySortOrder order) {}

我想在 V2 中重复使用。是否可以不在 L2S 中而不是在数据库中执行连接?我应该在数据库上下文中手动创建一个基类吗?

【问题讨论】:

  • 依赖于filter和order参数的使用,能否把GetData方法的代码发过来?
  • 不,它没有。因为 GetData() 仅使用 V1 的属性,并且在 V2 中重复。
  • 你能轻松拆分成两种方法 IEnumerable FilterAndSort(IEnumerable allData, MyFilter filter, MySortOrder order) 吗?
  • 如果你声明类V2并用L2S属性装饰它,你可以直接使用。 L2S 不知道也不关心视图和表格。

标签: c# .net sql linq-to-sql


【解决方案1】:

最终创建了一个包含V1 属性的接口,然后从中继承V1V2 声明(使用sqlmetal.exe 生成)(感谢部分类!):

public interface IV {
    int P1 {get;set;}
    int P2 {get;set;}
}

public partial class V1: IV { }
public partial class V2: IV { }

然后修改GetData():

IEnumerable<IV> GetData(Func<MyDataContext, IEnumerable<IV>> MyFilter filter, MySortOrder order) {}

所以我可以传入myDataContext.V1myDataContext.V2 实体集并转换结果。不知道这是否是最好的解决方案,但它很干燥,我很高兴。

【讨论】:

    猜你喜欢
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    相关资源
    最近更新 更多