gpt4 book ai didi

c# - Linq to SQL Repository ~理论~ - 通用但现在使用 Linq to Objects?

转载 作者:行者123 更新时间:2023-11-30 18:02:23 24 4
gpt4 key购买 nike

我目前从事的项目使用 Linq to SQL 作为 ORM 数据访问技术。它是一个 MVC3 Web 应用程序。我遇到的问题主要是由于无法模拟(用于测试)由 DBML 设计器自动生成的 DataContext。

因此,为了解决这个问题(经过大量阅读),我重构了现有的存储库系统——单个存储库,每个表都有单独和重复的访问方法,最终有大约 300 种方法,其中只有 10 种是唯一的——进入具有通用方法的单个存储库获取表并将更多通用类型返回到应用程序的上游。 DataContext 现在已包装,并且很容易模拟。

[编辑:为了实现这一点,我巧合地使用了下面 Jacob 提供的链接!]

我的问题更多地围绕着我迄今为止使用的设计以及我在应用程序结构中注意到的差异。

1) 重构了使用经典 Linq to SQL 查询的代码:

    public Billing GetBilling(int id)
{
var result = (
from bil in _bicDc.Billings
where bil.BillingId == id
select bil).SingleOrDefault();
return (result);
}

现在看起来像:

    public T GetRecordWhere<T>(Expression<Func<T, bool>> predicate) where T : class
{
T result;
try
{
result = _dataContext.GetTable<T>().Where(predicate).SingleOrDefault();
}
catch (Exception ex)
{
throw ex;
}
return result;
}

并且由 Controller 使用,查询如下:

_repository.GetRecordWhere<Billing>(x => x.BillingId == 1);

这很好,也正是我想要实现的。

...但是....我还必须执行以下操作才能准确获得我在 Controller 类中需要的结果集(本质上是应用程序的最高点)...

viewModel.RecentRequests = _model.GetAllRecordsWhere<Billing>(x => x.BillingId == 1)
.Where(x => x.BillingId == Convert.ToInt32(BillingType.Submitted))
.OrderByDescending(x => x.DateCreated).
Take(5).ToList();

据我的理解是正确的,这现在是在使用 Linq to Objects 而不是我以前使用的 Linq to SQL 查询?这样练习好吗?我觉得不对,但我不知道为什么。可能是因为查询的逻辑位于应用程序的最高层,而不是最低层,但是……我听从好人的建议。我考虑的问题之一是将整个表放入内存,但我知道使用 Iqeryable 返回类型将 where 子句带到数据库并在那里进行评估。因此只返回我需要的结果集......我可能是错的。

如果您已经做到了这一步,那就太好了。谢谢,如果您有任何建议,我们将不胜感激!!

更新:根据要求包含 GetAllRecordsWhere 方法

    public IQueryable<T> GetAllRecordsWhere<T>(Expression<Func<T, bool>> predicate) where T : class
{
return _dataContext.GetTable<T>().Where(predicate);
}

它使用:

    public IQueryable<TName> GetTable<TName>() where TName : class
{
return _db.GetTable<TName>().AsQueryable();
}

最佳答案

如果 _model.GetAllRecordsWhere 返回一个 IQueryable,那么您的后续查询仍然只是构建一个表达式树(我认为您使用 LinqToSql 的意思),它只会变成 SQL 并执行当您通过遍历集合或调用 ToList() 或 ToArray() 来枚举集合时。

顺便说一句,不要这样做:

catch (Exception ex)
{
throw ex;
}

您所做的只是吞下堆栈跟踪。如果你想重新抛出异常,只需调用 throw,永远不要调用 throw ex。如果你除了重新抛出之外什么都不做,那就不要捕获。现在的正常模式是捕捉,做一些日志记录,重新抛出。

关于c# - Linq to SQL Repository ~理论~ - 通用但现在使用 Linq to Objects?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8149584/

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