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的结果时,我通常会创建特定的类型,只需使用所需的字段声明一个类,而不使用匿名类型,