这可能是一个非常重要的问题,但是当编写跨越三个级别(或更多)的查询时,包含多个子实体的好方法是什么?
即我有4个表:Company,Employee,Employee_Car和Employee_Country
公司与员工有1:m的关系.
Employee与Employee_Car和Employee_Country都有1:m的关系.
如果我想编写一个返回所有4个表中数据的查询,我目前正在编写:
Company company = context.Companies
.Include("Employee.Employee_Car")
.Include("Employee.Employee_Country")
.FirstOrDefault(c => c.Id == companyID);
Run Code Online (Sandbox Code Playgroud)
必须有一个更优雅的方式!这是冗长的,并产生可怕的SQL
我在VS 2010中使用EF4
我在我的个人资料页面使用以下LINQ查询:
var userData = from u in db.Users
.Include("UserSkills.Skill")
.Include("UserIdeas.IdeaThings")
.Include("UserInterests.Interest")
.Include("UserMessengers.Messenger")
.Include("UserFriends.User.UserSkills.Skill")
.Include("UserFriends1.User1.UserSkills.Skill")
.Include("UserFriends.User.UserIdeas")
.Include("UserFriends1.User1.UserIdeas")
where u.UserId == userId
select u;
Run Code Online (Sandbox Code Playgroud)
它有一个长对象图并使用许多包含.它现在运行得很好,但是当网站有很多用户时,它会影响性能吗?
我应该用其他方式吗?
linq performance linq-to-entities entity-framework asp.net-mvc-2
我首先使用代码EF5,我有一个对象,其集合定义为virtual(延迟加载).这会在调用时返回数据.但是我希望它能够满载.我已从virtual属性签名中删除但现在它总是返回null数据.EF甚至没有运行查询,任何人都可以帮忙吗?
编辑:我知道.include()我只是喜欢使用非虚拟属性方法.
对象
User([Key]Id在Resource对象上,是person类的Parent):
namespace Entities
{
[Table("Users")]
public class User : Person
{
[Required]
public ICollection<Role> Roles { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
角色:
namespace Entities
{
public class Role
{
[Key]
public string Id { get; set; }
public virtual ICollection<User> Users { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud) 所以我的DbContext上有以下模型类:

每次我渲染一个LoanApplication对象列表时,我都会这样做:
var context = new MyContext();
var applications = context.LoanApplications.Where(d => d.PropertyThatIWantToFilter = localVariable);
Run Code Online (Sandbox Code Playgroud)
这将返回一个IQueryable,然后我在我的控制器方法调用上转换为这样的ViewModel:
var vm = applications.Select(d => new LoanApplicationViewModel(d));
Run Code Online (Sandbox Code Playgroud)
在LoanApplicationViewModel构造函数内部,我接受实体对象并执行相应的映射.问题在于,由于Solicitors集合是一个导航属性,因此每次实例化新的视图模型时都会对数据库进行调用.每个应用程序的平均律师数量是两个,这意味着如果我呈现一个列出最后10个应用程序的表,那么该应用程序将大约18-20次访问数据库.
我认为必须有一个更好的方法来获得这个集合,所以我改变了我的原始查询以急切加载集合,如下所示:
var applications = context.LoanApplications.Include("Solicitors").Where...
Run Code Online (Sandbox Code Playgroud)
虽然这会将对数据库的调用次数减少到只有一次,但查询速度要慢得多,大约慢50%.
该数据库托管在SQL Azure中,我们已经实现了瞬态故障处理,但我想,以减少不降低响应时间的性能对数据库进行调用的数量.
这里的最佳做法是什么?
c# asp.net-mvc entity-framework code-first azure-sql-database
有没有办法让实体对象通过关系自动提取所有相关数据,而不是必须.包括我想要填充的所有内容?我不能使用延迟加载,因为这需要序列化以通过WCF.让它自动填充相关集合真是太棒了.
我正在寻找一种方法来链接几个代表,所以一个人的结果成为下一个的输入.我试图在方程求解程序中使用它,其中部分通过不同的方法完成.这个想法是,当你构建方程式时,程序会添加代理并按特定顺序链接它们,因此可以正确解决.如果有更好的方法来解决问题,请分享.
我第一次玩实体框架。我正在编写以下简单查询:
public List<Request> GetResult(string code)
{
List<Request> requests = new List<Request>();
using (var db = new Context())
{
requests = (from c in db.Requests where c.Code == code select c).ToList();
}
return requests;
}
Run Code Online (Sandbox Code Playgroud)
有一些与Request对象相关的实体,例如与Results表具有一对一关系的Request表。但是,它们都返回 null。
如何使用实体框架进行查询并返回实体及其所有相关实体?
TIA
c# ×5
lazy-loading ×2
linq ×2
asp.net-mvc ×1
chaining ×1
code-first ×1
delegates ×1
entity ×1
performance ×1
poco ×1
wcf ×1