我有一个BaseScript,在脚本中有一个不加载相关实体的GetAll。
在DbContext中,禁用了LazyLodingEnabled(false)。
遵循一些代码来理解我的问题。在此示例中,当我想按语言获取消息时,它不会加载用户和messageViews。
BaseScript
public abstract class BaseScript<TEntity> where TEntity : EntityBase
{
public virtual IEnumerable<TEntity> GetAll()
{
using (EntityDbContext ctx = new EntityDbContext())
{
return ctx.Set<TEntity>().ToList();
}
}
}
MessageScript
public class MessageScript : BaseScript<Message>
{
public IEnumerable<Message> GetAllByLanguagePublic(string language)
{
return this.GetAllPublic().Where(x => x.Language == language).ToList();
}
}
消息实体:
public class Message : EntityBase
{
public string Text { get; set; }
public string Language { get; set; }
public virtual User User { get; set; }
public Guid UserId { get; set; }
public virtual ICollection<MessageView> MessageViews { get; set; }
}
答案 0 :(得分:1)
我想你的问题是“为什么User
和MessageViews
没有加载?”如果是这样的话,那你就是在回答自己。如果禁用延迟加载,则必须使用Include
显式加载这些属性(例如):
也许在您的BaseScript.GetAll
中,您想要返回IQueryable
而不是IEnumerable
,因此查询将不会被提取(请勿调用ToList()
)。然后,在GetAllByLanguagePublic
方法中,您可以执行此操作:
public class MessageScript : BaseScript<Message>
{
public IEnumerable<Message> GetAllByLanguagePublic(string language)
{
return this.GetAll()
.Include(x => x.User)
.Include(x => x.MessageViews)
.Where(x => x.Language == language).ToList();
}
}
请注意,您需要包含System.Data.Entity
以使用Include
和lambda表达式。