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

时间:2015-01-23 18:32:55

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

我有一个包含订阅者的表。自特定日期起,每个订阅者都在关注目标。有关目标的新信息正在名为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; 我的connectionstring摆脱了那个错误,我得到了我需要的结果。

必须有更好的方法。如果没有我将MultipleActiveResultsSets设置为true,有人可以告诉我应该如何做到这一点。

1 个答案:

答案 0 :(得分:0)

通常的做法是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查询,它不会有任何区别。)