标签: navigation-properties

使用Entity Framework导航属性而不创建大量查询(避免N + 1)

我一直在使用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

2
推荐指数
1
解决办法
5235
查看次数

IQueryable <T> .Include <T,object >>(Expression <Func <T,object >> not working

我试图使用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)

在单步执行包含行之后,我再次检查了查询值,发现它不包含导航属性

c# iqueryable navigation-properties

1
推荐指数
1
解决办法
1151
查看次数

复杂类型属性的表达式

我有一个场景,我从客户端网格的配置动态创建 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)

c# lambda expression navigation-properties

1
推荐指数
1
解决办法
1294
查看次数

外键引用对象返回null

我正在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

1
推荐指数
1
解决办法
501
查看次数