我有一个ASP.net MVC控制器操作,它从我的实体模型中检索项目列表。对于此实体,有一些属性不在实体本身中。我创建了一个部分类来添加这些属性:
public partial class Person
{
public int Extra
{
get
{
using( var ctx = new DBEntities() )
{
return ctx.OtherTable.Count(p => p.PersonID == this.PersonID);
}
}
}
}
如您所见,我需要访问的属性来自另一个表。在我的MVC页面中...我需要返回大量的人(每页100多个)。为了显示这个Extra字段,每个Person实体将分别单独访问数据库......这是非常低效的。我有一个查询返回所有人,然后对于每个人它有一个查询我喜欢这个每个属性。这最终可能是对数据库的300次调用,这需要很长时间才能执行。
有什么更好的方法可以做到这一点?理想情况下,我想执行一个返回所有People和额外数据的查询,但我还希望额外数据成为Person实体的一部分,即使它位于数据库中的单独表中。
更新
从评论中添加更多上下文。
我从存储库类返回People。我在另一个问题中被告知,存储库应该只处理实体本身。因此,检索人员的代码如下:
class PersonRepository
{
public IQueryable<Person> GetPeople() {
return from p in db.People
where p ...
select p;
}
}
我真的没有选择加入那种情况。
答案 0 :(得分:1)
我不确定您的数据库设计是如何完成的。但是为什么你不能加入来自两个相关表的数据并且一次点击数据而不是多次? 即使这对您来说很慢,您也可以缓存此数据,并能够在会话的生命周期内访问它。
答案 1 :(得分:1)
你可以做加入:
var result =
from p in ctx.Persons
from a in ctx.OtherTable
where p.PersonID == personID
select new SomeViewModel
{
Name = p.Person.Name,
OtherTableValue = a.OtherValue
};