当前位置:  开发笔记 > 编程语言 > 正文

使用包含()的LINQ to SQL进行预加载

如何解决《使用包含()的LINQtoSQL进行预加载》经验,为你挑选了1个好方法。

我花了两天的时间来反对这个问题,我似乎无法破解它(问题是).相同的代码工作正常,直到我添加数据库关系,我已经读了很多关于延迟加载.

我有两个数据库表,它们之间有1:1的关系. PromoCode表跟踪代码,并有一个名为的PK列id. CustomerPromotable有一个PromoId链接到PromoCode表的列id.这两个表没有其他关系.我在SQL Server Management Studio中生成了所有这些,然后从数据库生成模型.

为了使问题稍微复杂一点,我在WCF数据服务中这样做,但我不认为这应该有所作为(它在添加数据库关系之前有效).启用日志记录后,我总是在日志文件中获得带有文本的异常:

Dispose后访问DataContext.

我的函数当前返回表中的所有条目:

using (MsSqlDataContext db = new MsSqlDataContext())
{
    // This causes issues with lazy-loading
    return db.PromoCodes.ToArray();
}

我已经阅读了很多文章/页面/答案,他们都说要使用这种.Include()方法.但这对我不起作用:

return db.PromoCodes.Include(x => x.CustomerPromos).ToArray();

我也尝试了"魔术字符串"版本:

return db.PromoCodes.Include("CustomerPromos").ToArray();

我设法开始工作的唯一代码是:

PromoCode[] toReturn = db.PromoCodes.ToArray();

foreach (var p in toReturn)
    p.CustomerPromos.Load();

return toReturn;

我已经尝试.Where()为查询添加了一个条件,我已经尝试过了.Select(),我尝试.Include()过后移动.Where()(这个答案说要做到最后,但我认为这仅仅是由于嵌套查询).我已经读过有关.Include() 静默失败的场景,毕竟我不会更接近.

我错过了什么?语法问题?逻辑问题?一旦我将这个"简单"的案例工作,我还需要嵌套Includes(即如果CustomerPromo表有关系Customer).

编辑
包括所有相关代码.其余的是LINQ to SQL或WCF数据服务配置.这就是:

[WebGet]
[OperationContract]
public PromoCode[] Test()
{
    using (MsSqlDataContext db = new MsSqlDataContext())
    {
        return db.PromoCodes.Include(x => x.CustomerPromos).ToArray();
    }
}

如果我直接通过浏览器调用它(例如http://

:/DataService.svc/Test),我会收到重置连接消息,并且必须查找WCF日志才能找到" DataContext accessed after Dispose.".如果我通过网页中的AJAX调用进行相同的查询,我会收到状态的AJAX错误error(这就是全部!).



1> Ian..:

当我实际上没有要获取的任何子数据时,我过早地发布了上一个答案.当时我只对获取父数据感兴趣,而且答案有效.

现在当我真正需要子数据的时候,我发现它并没有完全发挥作用.我发现这篇文章表明.Include()(他说,Including()但我不确定这是不是一个错字)已被删除,并且正确的解决方案是使用DataLoadOptions.此外,我还需要启用单向序列化.

最重要的是,我不再需要了DeferredLoadingEnabled.所以现在最终的代码如下所示:

using (MsSqlDataContext db = new MsSqlDataContext())
{
    DataLoadOptions options = new DataLoadOptions();
    options.LoadWith(p => p.CustomerPromos);
    db.LoadOptions = options;

    return db.PromoCodes.ToArray();
}

设置后Unidirectional Serialisation,它将很乐意返回父对象,而无需加载子项或显式设置DeferredLoadingEnabled = false;.

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有