gpt4 book ai didi

linq - 我应该相信 LinqDataSource 正确清理吗?

转载 作者:行者123 更新时间:2023-12-04 06:16:09 24 4
gpt4 key购买 nike

将我的第一次尝试作为使用 LinqDataSource 的 OnSelecting 方法以便我可以指定更复杂的查询,我写了这样的:

protected void CategoriesDataSource_OnSelecting(object sender, LinqDataSourceSelectEventArgs e)
{
using (DataLayerDataContext db = new DataLayerDataContext())
{
e.Result = (from feed in db.Feeds
where feed.FeedName.StartsWith("Google")
select feed.MainCategory).Distinct();
}
}

当然,问题在于 using 子句将 Dispose DataLayerDataContext。 “解决方案”是在没有它的情况下编写它,但我担心上下文不会被及时处理,它会打开一堆连接,直到垃圾收集运行,等等。

我不是这方面的专家,所以对这是否是一个真正的问题有任何评论,还是我白担心?

最佳答案

啊,另一个人被延迟加载的不幸副作用烧伤了......

protected void CategoriesDataSource_OnSelecting(object sender, LinqDataSourceSelectEventArgs e)
{
using (DataLayerDataContext db = new DataLayerDataContext())
{
e.Result = (from feed in db.Feeds
where feed.FeedName.StartsWith("Google")
select feed.MainCategory).Distinct().ToList();
// ^^^^^^^^^
}
}

这将强制 DataLayerDataContext立即运行查询并创建一个不依赖于上下文或连接的内存列表。这样您就可以立即获得结果,并且可以随时处理上下文。

唯一的问题(根据 Steven 的评论)是延迟加载的导航属性;即使您强制查询进行评估,如果您尝试查询任何引用其他 LINQ 对象(或 LINQ 对象列表)的属性,它们也将无法加载 除非 您可以在 DataLoadOptions 中指定立即需要哪些属性的 DataContext .请参阅以下示例:
protected void CategoriesDataSource_OnSelecting(object sender, LinqDataSourceSelectEventArgs e)
{
using (DataLayerDataContext db = new DataLayerDataContext())
{
DataLoadOptions loadOptions = new DataLoadOptions();
loadOptions.LoadWith<Category>(c => c.SomeReference);
loadOptions.LoadWith<Category>(c => c.SomeOtherReferences);

db.LoadOptions = loadOptions;

e.Result = (from feed in db.Feeds
where feed.FeedName.StartsWith("Google")
select feed.MainCategory).Distinct().ToList();
}
}

一旦您手动指定了这些关联,LINQ to SQL 将在查询执行时将它们急切地加载到内存中,而不是将它们保留为延迟加载(这将导致在处理 DataContext 后使用属性时发生异常。)

关于linq - 我应该相信 LinqDataSource 正确清理吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7218319/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com