我一直在使用Entity Framework Profiler来测试我在MVC项目中的数据访问,并且由于N + 1问题我已经在几个页面上进行了比我需要的更多的数据库查询.
这是一个显示我的问题的简单示例:
var club = this.ActiveClub; // ActiveClub uses code similar to context.Clubs.First()
var members = club.Members.ToList();
return View("MembersWithAddress", members);
Run Code Online (Sandbox Code Playgroud)
视图循环遍历成员,然后跟随每个成员的navigion属性以显示其地址.每个地址请求都会产生额外的数据库查询.
解决此问题的一种方法是使用Include来确保我需要的额外表格在前面查询.但是,我似乎只能在直接附加到上下文的Clubs的ObjectSet上执行此操作.在这种情况下,ActiveClub属性由许多控制器共享,我并不总是想要预先查询成员和地址表.
我希望能够使用类似的东西:
var members = club.Members.Include("Address").ToList();
Run Code Online (Sandbox Code Playgroud)
但是,成员是一个EntityCollection,并且没有包含Include方法.
有没有办法强制加载成员EntityCollection并要求EF也加载他们的地址?
或者,以这种方式在实体上使用EntityCollection导航属性,这只是一个非常糟糕的主意; 当你从上下文中得到它时,你应该知道你正在加载什么?
entity-framework navigation-properties entity-framework-4 select-n-plus-1
我试图使用IQueryable Include方法加载导航属性,但是虽然表达式是正确的我没有得到任何结果
这是代码
protected void LoadNavigationProperty(ref IQueryable<T> query, Expression<Func<T, object>>[] navigationProperties)
{
if ((query != null) && (navigationProperties != null))
{
foreach (Expression<Func<T, object>> navigationProperty in navigationProperties)
{
query.Include<T, object>(navigationProperty);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在查询上设置了一个断点.包括并检查数据:
navigationProperties[0] = { n => n.UserStatus }
navigationProperties[1] = { n => n.PrivilegeLevel }
Run Code Online (Sandbox Code Playgroud)
在单步执行包含行之后,我再次检查了查询值,发现它不包含导航属性
我有一个场景,我从客户端网格的配置动态创建 WHERE 子句。客户端向服务器发送一些 json,然后我将其解析并随后转换为表达式,以便它可以作为 where 子句传递到存储库中。
目前,我正在努力为复杂的属性类型创建表达式,如下所示:
public partial class Resource
{
public string DisplayName { get; set; }
public virtual ResourceType ResourceType { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
下面将转换为表达式的代码适用于像 Displayname 属性这样的简单类型。表达式将类似于:
x => x.DisplayName == "ValueEnteredByUserInTheUI"
Run Code Online (Sandbox Code Playgroud)
但是,当在网格中为 ResourceType 属性输入值时,表达式最终将类似于:
x => x.ResourceType == "ValueEnteredByUserInTheUI"
Run Code Online (Sandbox Code Playgroud)
我错过了一个步骤来转换成这个:
x => x.ResourceType.Name == "ValueEnteredByuserInTheUI"
Run Code Online (Sandbox Code Playgroud)
任何人都可以在这里指出正确的方向吗?
public Expression<Func<T, bool>> GetExpression<TEntity>(string field, string operation, object value, string ignoreCase)
{
Expression<Func<T, bool>> whereClause = default(Expression<Func<T, bool>>);
// Define lambda
ParameterExpression param = Expression.Parameter(typeof(T), "x");
MemberExpression member = …
Run Code Online (Sandbox Code Playgroud) 我正在AbpUser
使用以下属性定义引用实体中的表:
[ForeignKey("LocationManagerId")]
public virtual User LocationManager { get; set; }
public virtual long LocationManagerId { get; protected set; }
Run Code Online (Sandbox Code Playgroud)
我的DTO如下:
[AutoMapFrom(typeof(Location))]
public class LocationDto : FullAuditedEntityDto<Guid>
{
// <snip>
public virtual User LocationManager { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
使用AsyncCrudAppService
和从MVC控制器调用以下命令:
var locations = (await _locationAppService.GetAll(new PagedAndSortedResultRequestDto())).Items;
Run Code Online (Sandbox Code Playgroud)
locations.LocationManager
正在返回null
。我已经确认实体中的所有内容以及DTO都设置为virtual
。我很茫然。有人有见识吗?
c# navigation-properties entity-framework-core asp.net-core aspnetboilerplate