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

标签 c# sql-server entity-framework linq-to-entities connection-string

我有一个包含订阅者的表。每个订阅者都从某个日期开始关注 Targets。有关目标的新信息正在名为 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; }
}

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

There is already an open DataReader associated with this Command which must be closed first.

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

必须有更好的方法。如果我没有将 MultipleActiveResultsSets 设置为 true,谁能告诉我应该如何完成。

最佳答案

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? 以允许使用 ?? 运算符。现在,如果没有 SubscriberReports,则对 sr.ToDate 的查询将返回空日期。 (实际上,这只是让编译器高兴的一个技巧,对于生成的 SQL 查询,它不会产生任何影响)。

关于c# - 连接字符串中缺少 MultipleActiveResultSets 导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28116457/

相关文章:

c# - 应该多广泛地使用异步/等待模式?

c# - Border.Effect 绑定(bind)泄漏内存但 Border.Background 没有

c# - Entity Framework 和 Web API ObjectDisposedException

c# - 查找并删除所有以 x 开头的字符串

c# - 使用 new 关键字中断虚拟调用并再次启动新的虚拟层次结构

mysql - 将记录从 mysql 数据库中的表复制到 SQL-SERVER 2008 数据库?

c# - 输出参数

sql-server - 将数据从 XML 插入到 SQL Server 中的表中

entity-framework - 如何使用 Entity Framework 4 继承来确定实体的子类型?

entity-framework - Entity Framework - 获取表列表