Linq to sql 使用Linq到SQL、IOC和存储库模式预取中的数据

Linq to sql 使用Linq到SQL、IOC和存储库模式预取中的数据,linq-to-sql,architecture,inversion-of-control,datacontext,prefetch,Linq To Sql,Architecture,Inversion Of Control,Datacontext,Prefetch,使用LINQtoSQL,我想预取一些数据 1) 常见的解决方案是处理数据加载选项,但在我的体系结构中它不起作用,因为: 必须在第一次查询之前设置选项 我使用的是IOC,所以我不直接实例化DataContext(我无法在实例化时执行代码) 我的DataContext在web请求期间是持久的 2) 我看到了另一种可能性,即在方法中加载数据及其子项,然后只返回数据(因此子项已加载) 然而,在我的体系结构中,它无法工作: 我的查询从我的存储库中级联出来,可以被许多将添加子句的服务使用 我使用接口,

使用LINQtoSQL,我想预取一些数据

1) 常见的解决方案是处理数据加载选项,但在我的体系结构中它不起作用,因为:

  • 必须在第一次查询之前设置选项
  • 我使用的是IOC,所以我不直接实例化DataContext(我无法在实例化时执行代码)
  • 我的DataContext在web请求期间是持久的
2) 我看到了另一种可能性,即在方法中加载数据及其子项,然后只返回数据(因此子项已加载)

然而,在我的体系结构中,它无法工作:

  • 我的查询从我的存储库中级联出来,可以被许多将添加子句的服务使用
  • 我使用接口,linq到sql对象的具体实例不会离开存储库(是的,您可以使用接口和添加子句)
  • 我的存储库是通用的
是的,这种架构非常复杂,但它非常酷,因为我可以玩乐高这样的代码;)


我的问题是:预取数据的其他可能性是什么?

我不知道其他可能性,似乎您已经将LinqToSql推到了极限(但是,我可能错了)

我认为在这一点上,你最好的选择是:

  • 向应用程序中添加一些“非泛型”方法,以仅处理 您希望/需要立即加载而不需要的特定场景 对这些方法使用“普通”、“通用”基础结构
  • 使用一个ORM,该ORM对即时和延迟加载有更复杂的支持
  • 我找到了解决办法。 我的答案是“依赖注入”

    它通常随IOC一起提供,这意味着您可以让您的IOC容器在实例化时管理类的注入

    我只需要在实例化DC时插入一个CustomDCParameter类。
    该类将包含规则,构造函数将应用所有规则。

    在我的应用程序中,我可能会对您的潜在解决方案使用一种变体#2。这有点难以解释,但很简单:我用custom在模型中链接并延迟延迟延迟加载,以便从LinqToSql特定的差异执行中抽象出来,我用
    IQueryable
    利用了这些差异执行。好处:

    • 我的域模型和服务层不一定要依赖于LinqToSql提供程序(如果愿意,我可以用接口交换DAL)
    • 我的服务方法可以并且确实返回完整的对象图,其中包含多个“锚定点”,用于使用抽象掉特定延迟加载实现的类进行延迟加载,因此我可以使用LinqToSql特定的差异执行或其他方法(例如,anon委托。再次,请参阅)
    • 我可以在我的整个应用程序中维护
      IQueryable
      结果(如果我愿意,甚至可以到UI),从而允许无限的LINQ查询链接,而不必担心性能

    谢谢你的回答1)我可以放一些非通用代码,但真正的问题是我真的希望我的层被分开。我的查询由服务层操作,数据库调用由它们触发(透明),我不想在其中添加技巧代码;)松耦合必须付费:你可能是对的。对于当前项目来说已经太晚了,但是对于下一个项目,我将使用其他ORM进行一些测试。有什么建议吗?理想情况下,与linq兼容的东西会很棒(我真的很喜欢使用它),松耦合有时会以增加复杂性为代价。这是你的选择,你想如何进行权衡。NHibernate对即时加载和延迟加载提供了完善的支持,并且还支持Linq,但是可能还有其他的ORM可以满足这些要求。谢谢,这是一个非常有趣的解决方案。它集中在数据对象上,我发现它更好。不幸的是,它不能满足我当前的需求,因为我的整个体系结构都是基于延迟加载的,获取的属性是例外!不过,我将尝试基于这种“以数据对象为中心”的编写方式创建FetchItem和FetchList,因为我非常喜欢它。我正在考虑使用属性自动生成我之前提到的“CustomDCParameter”类。如果我找到了一个可以接受的解决方案(当我有时间去做的时候),我会和大家分享。仍然在倾听好的建议我想你可能误解了我-当你说“fetched”时,你的意思是立即从数据库加载吗?与延迟/延迟加载相反?