Linq 存储库和 GetTable()

发布于 2024-09-26 12:14:50 字数 468 浏览 3 评论 0原文

我遵循相当标准的 L2S 存储库模式,使用以下方法作为方法之一,

public IEnumerable<T> GetAllByFilter(Func<T, bool> expression)
 {
     return _dataContext.GetTable<T>().Where(expression);
 }

我有点生气地看到对 GetTable 的调用似乎确实获取了表,其中 Where 表达式可能随后在内存中计算。

这样的简单调用

因此,像var order = GetAllByFilter(o => o.OrderNumber == 1);

应该只返回一条记录,但会获取整个 50000 条记录的数据库。

Linq 通常这么糟糕吗?或者我错过了什么?

I'm following the fairly standard L2S repository pattern, using the following as one of the methods

public IEnumerable<T> GetAllByFilter(Func<T, bool> expression)
 {
     return _dataContext.GetTable<T>().Where(expression);
 }

I'm a bit miffed to see that the call to GetTable appears to literally get the table, with the Where expression presumably evaluated in-memory afterwards.

So a simple call like

var order = GetAllByFilter(o => o.OrderNumber == 1);

which should only ever return one record, is fetching the entire 50000 record database.

Is Linq normally this bad? Or am I missing something?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

榕城若虚 2024-10-03 12:14:50

更改

public IEnumerable<T> GetAllByFilter(Func<T, bool> expression)
{
    return _dataContext.GetTable<T>().Where(expression);
}

为:

public IQueryable<T> GetAllByFilter(Expression<Func<T, bool>> expression)
{
    return _dataContext.GetTable<T>().Where(expression);
}

这将使用Queryable(即SQL)而不是Enumerable(即本地),因此性能会更好。

Change:

public IEnumerable<T> GetAllByFilter(Func<T, bool> expression)
{
    return _dataContext.GetTable<T>().Where(expression);
}

To:

public IQueryable<T> GetAllByFilter(Expression<Func<T, bool>> expression)
{
    return _dataContext.GetTable<T>().Where(expression);
}

This will use Queryable (i.e. SQL) instead of Enumerable (i.e. local) and therefore will perform much better.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文