0

データベースにクエリを実行していますが、必ずしもクエリで返したくないナビゲーション プロパティがいくつかあります。遅延読み込みを無効にするために多くのナビゲーション プロパティを含めていますが、Producer エンティティで問題が発生します。生産者はワインと 1 対多の関係を持ち、ワインは生産者と 1 対 1 の関係を持ちます。クエリを実行するとき、生産者情報 (名前、住所、電話番号など) が必要ですが、このクエリに関連付けられた生産者にあるワインのリストは必要ありません。一部のプロデューサー フィールドのみを含めるために使用できる linq メソッドはありますか? json を介してオブジェクトを送り返しているため、これは単なる問題です。そのため、余分なデータはすべて必要ありません。

Wine w = db.Wines.Where(n => n.WineID == WineID).Include(n => n.VarType).Include(n => n.Origin).Include(n => n.App)
                .Include(n => n.Vintage).Include(n => n.Importer).Include(n => n.Reviews.Select(r => r.Publication))
                .Include(n => n.Producer.Name).Include(n => n.Docs).FirstOrDefault();

public class Producer : Contact
{
    [Key]
    public int ProducerID { get; set; }
    public string Name { get; set; }
    public string Twitter { get; set; }


    public virtual ICollection<Wine> Wines { get; set; }
    public virtual ICollection<UserObj> UserObjs { get; set; }
}

public class Wine :Updater
    {
        public int WineID { get; set; }
        //public int WineTypeID { get; set; }
        [Display(Name = "Varietal/Type")]
        public int? VarTypeID { get; set; }
        [Display(Name = "Origin")]
        public int? OriginID { get; set; }
        [Display(Name = "Appellation")]
        public int? AppID { get; set; }
        [Display(Name = "Vintage")]
        public int? VintageID { get; set; }
        [Display(Name = "Importer")]
        public int? ImporterID { get; set; }
        public int ProducerID { get; set; }
        public string Designate { get; set; }
        [Display(Name = "Drink Window")]
        public string DrinkWindow { get; set; }
        public string Body { get; set; }
        public string SKU { get; set; }
        [Display(Name = "Case Production")]
        public int? CaseProduction { get; set; }
        [Display(Name = "Alcohol Content")]
        public double? AlcoholContent { get; set; }
        public string Winemaker { get; set; }
        [Display(Name = "Consulting Winemaker")]
        public string ConsultWinemaker { get; set; }
        public bool Sustainable { get; set; }
        public bool Kosher { get; set; }
        public bool Organic { get; set; }
        public bool Biodynamic { get; set; }
        public bool SalmonSafe { get; set; }
        public Boolean Active { get; set; }

        public virtual WineType WineType { get; set; }

        public virtual VarType VarType { get; set; }
        public virtual Origin Origin { get; set; }
        public virtual App App { get; set; }
        public virtual Vintage Vintage { get; set; }
        public virtual Importer Importer { get; set; }
        public virtual Producer Producer { get; set; }

        public virtual ICollection<POS> POSs { get; set; }
        public virtual ICollection<Review> Reviews { get; set; }
        public virtual ICollection<Doc> Docs { get; set; }

        public IEnumerable<SelectListItem> BodyList { get; set; }
}
4

1 に答える 1

1

まあ、あなたがそうするなら

.Include(n => n.Producer) //not n.Producer.Name

ワインのプロデューサーを「イーガーロード」しますが、ワインのプロデューサーはロードしません.ワイン...

別の方法は、匿名オブジェクトを使用して目的のプロパティのみを取得することです

db.Wines.Where(n => n.WineID == WineID)
.Select(w => new {
        w.VarType.Cepage,
        w.Origin.Description,
        ///blabla
        w.Producer.Name,
        w.Producer.Address.Street,
}).FirstOrDefault();

編集

それでも最初の解決策が必要な場合は、こちらをご覧ください。「循環参照」を避けるために。 エンティティ フレームワークは、POCO を JSON にシリアル化します

または別のソリューション EF 4.1 - Code First - JSON Circular Reference Serialization Error

于 2012-06-04T20:17:21.493 に答える