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

C# 关闭数据库连接后使用匿名类型,c#,entity-framework,anonymous-types,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.ActDateTi

我有类似于下面的代码

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)
    {
        /* ... */
    }
}
这似乎很好,但我的循环有很多处理。我担心在处理过程中,我会使数据库连接或其他资源处于打开状态

我尝试在
using
语句之前声明
var activities
,以便在
using
语句之后处理数据,但必须在声明该变量的位置初始化该变量

了解EF内部工作原理的人能否告诉我,当EF上下文处于“活动”状态时,进行长时间处理是否存在问题,以及我如何使这些问题得到缓解


在我这样做的时候,也许你也可以评论一下我在循环中使用了
act.Category.CatName
。这是相关表中的值。我是否最好在EF查询中使用联接,以便一次获取所有数据,而不是强制另一个(?)数据库访问来获取相关数据?

您可以手动处理DataContext

此外,您需要对查询调用
ToArray
,以便立即执行查询(而不是在处理上下文之后):

但是,我建议您切换到非匿名类型,这样您就可以继续使用
using
来处理上下文。

例如,即使发生异常,
使用
也会小心地调用
Dispose

您可以手动处理DataContext

此外,您需要对查询调用
ToArray
,以便立即执行查询(而不是在处理上下文之后):

但是,我建议您切换到非匿名类型,这样您就可以继续使用
using
来处理上下文。

例如,即使发生异常,
使用
也会小心地调用
Dispose

分离读取和处理的最大问题是,您的代码根本不这样做

第一条语句只创建一个能够获取数据的表达式,但实际上它根本不获取任何数据。直到你开始阅读它,它才真正得到任何数据

在使用该代码处理数据之前,必须做两件事才能关闭数据库连接。您必须使用
ToList
方法实际获取数据,而不仅仅是设置表达式,并且必须使用
Dispose
而不是
使用
以避免在其作用域内隔离匿名类型:

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 }
).ToList();

context.Dispose();

foreach (var activity in activities) {
    /* ... */
}
这种方法的一个缺点是,在
using
提供的代码周围没有隐式的
try…finally
,因此如果在获取数据时出现错误,则不会处理上下文

另一种方法是声明一个可以保存您读取的数据的类,以便您可以在
using
块之外使用已知类声明变量:

List<Activity> activities;
using (MyEntities context = new MyEntities()) {
  activities = (
    from act in context.Activities
    where act.ActTwittered == false
    select new Activity(act.ActID, act.ActTitle, act.Category, act.ActDateTime, act.Location)
  ).ToList();
}
列出活动;
使用(MyEntities context=new MyEntities()){
活动=(
从上下文中的行为。活动
其中act.ActTwittered==false
选择新活动(act.ActID、act.ActTitle、act.Category、act.ActDateTime、act.Location)
).ToList();
}

将读取和处理分离的最大问题是,您的代码根本不这样做

第一条语句只创建一个能够获取数据的表达式,但实际上它根本不获取任何数据。直到你开始阅读它,它才真正得到任何数据

在使用该代码处理数据之前,必须做两件事才能关闭数据库连接。您必须使用
ToList
方法实际获取数据,而不仅仅是设置表达式,并且必须使用
Dispose
而不是
使用
以避免在其作用域内隔离匿名类型:

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 }
).ToList();

context.Dispose();

foreach (var activity in activities) {
    /* ... */
}
这种方法的一个缺点是,在
using
提供的代码周围没有隐式的
try…finally
,因此如果在获取数据时出现错误,则不会处理上下文

另一种方法是声明一个可以保存您读取的数据的类,以便您可以在
using
块之外使用已知类声明变量:

List<Activity> activities;
using (MyEntities context = new MyEntities()) {
  activities = (
    from act in context.Activities
    where act.ActTwittered == false
    select new Activity(act.ActID, act.ActTitle, act.Category, act.ActDateTime, act.Location)
  ).ToList();
}
列出活动;
使用(MyEntities context=new MyEntities()){
活动=(
从上下文中的行为。活动
其中act.ActTwittered==false
选择新活动(act.ActID、act.ActTitle、act.Category、act.ActDateTime、act.Location)
).ToList();
}

您的问题在于希望匿名类型能够在其上下文之外访问。您可以为结果使用特定类型,并可以灵活地在任何地方访问值

public class ActivitySummary
{
    public int ActID { get; set; }
    public string ActTitle { get; set; }
    public string Category { get; set; }
    public DateTime ActDateTime { get; set; }
    public string Location { get; set; }
}

列出活动;
使用(MyEntities context=new MyEntities())
{
活动=来自上下文中的act。活动
其中act.ActTwittered==false
选择new ActivitySummary{act.ActID,act.ActTitle,act.Category,act.ActDateTime,act.Location}.ToList();
}
foreach(活动中的var活动)
{
/* ... */
}

您的问题在于希望匿名类型能够在其上下文之外访问。您可以为结果使用特定类型,并可以灵活地在任何地方访问值

public class ActivitySummary
{
    public int ActID { get; set; }
    public string ActTitle { get; set; }
    public string Category { get; set; }
    public DateTime ActDateTime { get; set; }
    public string Location { get; set; }
}

列出活动;
使用(MyEntities context=new MyEntities())
{
活动=来自上下文中的act。活动
其中act.ActTwittered==false
选择new ActivitySummary{act.ActID,act.ActTitle,act.Category,act.ActDateTime,act.Location}.ToList();
}
foreach(活动中的var活动)
{
/* ... */
}

当我需要长期使用DB的结果时,我通常会创建特定的类型,只需使用所需的字段声明一个类,而不使用匿名类型,