【发布时间】:2014-10-19 00:53:55
【问题描述】:
我正在开发一个 ASP.NET MVC 4 Web 应用程序。我使用Entity Framework 作为数据访问层,使用数据库优先方法(.edmx 文件)。
目前我在两个不同数据库中定义的连接表中遇到问题(即我有两个 .edmx 文件)。
例如,如果我想加入表,我正在执行以下查询:-
public ActionResult AutoComplete(string term)
{
var tech = repository.AllFindTechnolog(term).Take(100);//Call to the first database
var resources = repository.GetResources(tech.Select(a => a.IT360ID.Value).ToArray(), false);//call to the second database
var query = from techItems in tech
join resourcesItems in resources
on techItems.IT360ID.Value equals resourcesItems.RESOURCEID // join based on db2ID
orderby techItems.PartialTag
select new //code goes here
return Json(query, JsonRequestBehavior.AllowGet);
}
我将对数据库进行两次单独的调用,并在应用程序服务器内部进行一次连接,这不是面向性能的最佳解决方案。理想情况下,连接将完全发生在数据库引擎内部。
我知道存储过程将允许我纯粹在服务器上连接来自不同数据库的表,但我不想使用 SP,因为它会降低我的代码的可维护性和可测试性。
所以我正在寻找一种解决方案,我可以使用实体框架进行连接并产生单个数据库连接?
【问题讨论】:
-
主要思想是,我们选择使用 Entity Framework 作为我们的数据访问层是因为它提供了以下主要功能:- 1. 数据访问代码作为整个应用程序。与存储过程相比,可测试性更强,开发时间更快。2、EF在数据库之上提供了一层,我们的产品可以在不同的数据库供应商上工作。正如我提到的,我们目前唯一直接依赖于数据库的功能是用于执行高级搜索的存储过程
-
但是如果我想开始为不同的功能创建视图,那么我将失去 EF 提供的优势。所以让我重新构建我原来的问题是我目前使用两个单独的 sql 语句从两个数据库中检索相关数据的方法,然后在应用程序服务器上加入数据,这被认为是一个非常糟糕的设计?虽然我将有两个单独的查询,但与单个连接 sql 语句相比,它们的成本更低......
-
我可能会为您提供解决方案,但我有一个问题:您在
query变量中选择了什么?您是从两种上下文中获取数据,还是仅从其中一种中获取数据(即仅获取tech中存在于resources中的项目)? -
另外,
AllFindTechnolog和GetResources的返回类型是什么? -
@IronMan84 我将我的上下文命名为 context1 和 context2。在 context1 中我将返回 Technology 对象,而在 context2 中我将返回 Resource 对象。我正在做的是我将从 context1 返回第一个 context1.Technology 100 记录,这些记录以传递的术语开头。然后在每个 Technology 对象中都有一个名为 IT360 的字段,其中包含 context2 中记录的 ID。所以基本上我会在第一个存储库调用中选择 100 个 context1.Technology 对象,选择它们的 IT360 id,然后我将根据选择的 100 个 IT360 id 查询 context2.Resoure。然后加入他们
标签: asp.net-mvc entity-framework linq join entity-framework-5