2016-10-13 3 views
0

私はBaseScriptを持っていますが、スクリプトには関連するエンティティをロードしないGetAllがあります。BaseScript(DbContext)の関連エンティティをロードしています

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; } 
} 

答えて

1

私はあなたの質問があるとし、 "なぜされていないUserMessageViewsロード?"そうであれば、あなたは自分自身に答えています。あなたが遅延読み込みを無効にした場合は、(たとえば)Includeを使用して、明示的にこれらのプロパティをロードする必要があります。

たぶん、あなたBaseScript.GetAllあなたの代わりにIEnumerableIQueryableを返すようにしたいので、クエリがまだexectuedされることはありませんで(ありませんToList()と呼んでください)。次に、あなたのGetAllByLanguagePublic方法であなたがこれを行うことができます:あなたはラムダ式でIncludeを使用するSystem.Data.Entityを含める必要が

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(); 
    } 
} 

注意を。

関連する問題