连接字符串中缺少 MultipleActiveResultSets 导致错误

Posted

技术标签:

【中文标题】连接字符串中缺少 MultipleActiveResultSets 导致错误【英文标题】:Missing MultipleActiveResultSets from the connection string causing an error 【发布时间】:2015-03-22 21:05:39 【问题描述】:

我有一张有订阅者的桌子。自特定日期以来,每个订阅者都在关注目标。有关目标的新信息正在一个名为 TargetDatas 的表中累积。

我想创建一个需要获取报告的订阅者列表,其中包含自上次报告以来有关目标的更新/或自跟踪目标之日起未发布任何报告。

我尝试了 2 天来找出一个 linq 查询来获取该列表,但失败了。我可以获得列表的唯一方法是这样的:

List<Subscriber> outlistl = new List<Subscriber>();

foreach (Subscriber s in db.Subscribers)

    bool foundUpdate = false;

    foreach (TargetSubscriber ts in s.TargetsX)
    
        //has this subscriber received a report in the past
        //if yes, since that date
        //otherwise, since the target is being watched
        DateTime fromDate;

        var latestReport = s.SubscriberReports.OrderByDescending(sr => sr.ToDate).FirstOrDefault();

        if (latestReport != null)
        
            fromDate = latestReport.ToDate;
        
        else
        
            fromDate = ts.CreatedDate;
        

        foreach (TargetData td in ts.Target.TargetDatas)
        
            if (td.CreatedDate > fromDate)
            
                outlistl.Add(s);
                foundUpdate = true;
                break;
            
        
        if (foundUpdate)  break; 
    
    if (foundUpdate)  break; 

当我第一次运行它时出现错误:

已经有一个打开的 DataReader 与此命令关联,必须先关闭。

经过一些研究,我发现添加 MultipleActiveResultSets=True; 到我的连接字符串摆脱了那个错误,我得到了我需要的结果。

必须有更好的方法。在我没有将 MultipleActiveResultsSets 设置为 true 的情况下,有人可以告诉我应该如何完成。

【问题讨论】:

你有什么具体原因不想将 MultipleActiveResultSets 设置为 true 吗? 不,我只是想如果默认情况下它不是真的,可能会有影响。被告知这是常见的做法 【参考方案1】:

拥有MultipleActiveResultSets=True 是常见的做法。 EF 通常需要能够延迟加载它正在实现的对象的导航属性。

但我认为您的查询应该如下所示:

from s in db.Subscribers
from ts in s.TargetsX
let fromDate = s.SubscriberReports.Select(sr => (DateTime?)sr.ToDate)
                .OrderByDescending(d => d)
                .FirstOrDefault() ?? ts.CreatedDate
where ts.Target.TargetDatas.Any(td => td.CreatedDate > fromDate)
select s

我将sr.ToDate 转换为DateTime? 以允许使用?? 运算符。现在,如果没有SubscriberReportssr.ToDate 的查询将返回一个空日期。 (事实上​​,这只是让编译器满意的一个技巧,对于生成的 SQL 查询,它不会产生任何影响)。

【讨论】:

感谢您提供的信息。我不知道 MultipleActiveResultSets=True 是常见的做法。我想如果默认情况下没有启用它,那可能是有充分理由的。 哎呀 - 快速按 Enter 键。我一定会尝试您给我的查询,更重要的是 - 尝试理解它!再次感谢

以上是关于连接字符串中缺少 MultipleActiveResultSets 导致错误的主要内容,如果未能解决你的问题,请参考以下文章

错误Appstore连接:Info.plist文件中缺少目的字符串

JDBC 中缺少 dll

Visual Studio 2015 中缺少 LocalDB?

tomcat jdbc 连接池中缺少连接

错误:连接中缺少已解决的属性

DataGrip Snowflake 连接器中缺少“身份验证器”