我正在尝试创建一个使用WinForms实现MVP模式的应用程序。
其中我也使用EF+CodeFirst+Linq。
在VIEW上有DataGridView
控件,需要填充数据。VIEW调用PRESENTER类的方法SELECT()
,然后调用MODEL的方法SELECT()
。
如何通过PRESENTER将数据从数据库传输到VIEW?
我正在尝试使用return
,但它不起作用,因为我正在使用USING
块。
internal void Select()
{
using (GoodsContext context = new GoodsContext())
{
var items = from Items in context.Goods
select Items;
}
}
这个问题很有趣。当然,可以将查询具体化并将其返回为IEnumerable
,但我想知道将其返回成IQueryable
的方法是什么,以允许进一步的筛选/排序等。我看到的唯一方法是而不是处理DbContext
(显然返回的可查询对象保留了对它的引用),但它安全吗?然后我在谷歌上搜索了一下,发现了这个问题。我总是必须对我的DbContext对象调用Dispose()吗?没有。里面的解释对我来说听起来很合理,而且我们已经有了一个不应该使用的一次性对象(Task
)Dispose
。
很快,您可以删除using
语句并返回IQueryable
。
将Select
方法的返回类型更改为List<Good>
然后将结果"具体化"到数据列表中,您将不依赖DataContext
internal List<Good> Select()
{
using (GoodsContext context = new GoodsContext())
{
return context.Goods.Select(items => items).ToList();
}
}
您应该将方法Select
的类型从void
更改为IEnumerable<Good>
,以便能够返回一些内容。还使用.ToList
将结果具体化为List
:
internal IEnumerable<Good> Select()
{
using (GoodsContext context = new GoodsContext())
{
var items = (from Items in context.Goods
select Items).ToList();
return items;
}
}