关闭数据库连接后使用匿名类型

Jon*_*ood 1 c# entity-framework anonymous-types

我的代码类似于以下内容.

using (MyEntities context = new MyEntities())
{
    var activities = from act in context.Activities
                     where act.ActTwittered == false
                     select new { act.ActID, act.ActTitle, act.Category, act.ActDateTime, act.Location };

    foreach (var activity in activities)
    {
        /* ... */
    }
}
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常,但我的循环有很多处理.我担心在此处理期间我将保留数据库连接或其他资源.

我尝试var activities在using语句之前声明,因此我可以在using语句之后处理数据,但是必须在声明它的地方初始化该变量.

知道EF内部工作原理的人能否告诉我,当EF上下文"活着"时,是否存在长时间处理的问题,以及我如何减轻这些问题.

虽然我在这里,也许你也可以评论我act.Category.CatName在循环中使用的事实.这是相关表格中的值.我最好在我的EF查询中使用连接,这样我就可以一次性获取数据而不是强制另一个(?)数据库访问来获取相关数据?

Fyo*_*kin 5

您可以让编译器通过调用泛型方法来推断结果类型:

    public static T CallFunc<T>( Func<T> theFunc )
    {
        return theFunc();
    }

    ... 

    var activities = CallFunc( () =>
    {
        using( var context = new MyEntities() )
        {
            return 
                (
                    from act in context.Activities
                    where act.ActTwittered == false
                    select new { act.ActID, act.ActTitle, act.Category, act.ActDateTime, act.Location };
                )
                .ToList();
        }
    } );

    foreach( var a in activities ) ...
Run Code Online (Sandbox Code Playgroud)

不要忘记.ToList()最后,否则在你对它进行枚举之前,你的查询将不会被实际执行,这将在关闭上下文后发生.