2016-12-23 2 views
-1

EF Core 1.1での遅延読み込みはまだサポートされていませんが、以下のコードはなぜ機能するのですか?私はProductType、ProductSizeのような関連するオブジェクトにInclude関数を使用していませんが、これはエラーを起こしません。EF Core 1.1はこの遅延ロードです

何か考えてください。

List<ProductViewModel> data = await (from s in _context.Product 
              where ((categorySearchValue == -1 || s.ProductCategoryId == categorySearchValue) 
              && (typeSearchValue == -1 || s.ProductTypeId == typeSearchValue) 
              && (sizeSearchValue == -1 || s.ProductSizeId == sizeSearchValue)) 
              select new ProductViewModel 
              { 
               ProductID = s.ProductId, 
               ProductName = s.ProductName, 
               ProductCategory = s.ProductCategory.ProductCategoryName, 
               ProductType = s.ProductType.ProductTypeName, 
               ProductSize = s.ProductSize.ProductSizeName, 
               CurrentQuantity = s.CurrentQuantity, 
               QuantityPerBox = s.QuantityPerBox, 
               AvgUnitCost = s.AvgUnitCost, 
               MainVendor = s.MainSeller.CustomerName, 
               IncludePBox = (Convert.ToBoolean(s.IsPboxIncluded) ? "Y" : "N"), 
               Disabled = (s.Inactive ? "Y" : "N"), 
               IsTaxProduct = (Convert.ToBoolean(s.IsTaxProduct) ? "Y" : "N"), 
               UnitType = s.ProductUnitType.ProductUnitTypeName 
              }).ToListAsync(); 

製品モデルクラスは以下の通りです。

public partial class Product 
{ 
    public Product() 
    { 
     TransactionLine = new HashSet<TransactionLine>(); 
     TransactionLog = new HashSet<TransactionLog>(); 
    } 

    public int ProductId { get; set; } 
    public string ProductName { get; set; } 
    public int CurrentQuantity { get; set; } 
    public int AvgUnitCost { get; set; } 
    public int QuantityPerBox { get; set; } 
    public int ProductCategoryId { get; set; } 
    public int? ProductSizeId { get; set; } 
    public int? ProductTypeId { get; set; } 
    public int ProductUnitTypeId { get; set; } 
    public int MainSellerId { get; set; } 
    public bool IsTaxProduct { get; set; } 
    public bool IsPboxIncluded { get; set; } 
    public bool Inactive { get; set; } 
    public DateTime DateUpdated { get; set; } 

    public virtual ICollection<TransactionLine> TransactionLine { get; set; } 
    public virtual ICollection<TransactionLog> TransactionLog { get; set; } 
    public virtual Customer MainSeller { get; set; } 
    public virtual ProductCategory ProductCategory { get; set; } 
    public virtual Product ProductNavigation { get; set; } 
    public virtual Product InverseProductNavigation { get; set; } 
    public virtual ProductSize ProductSize { get; set; } 
    public virtual ProductType ProductType { get; set; } 
    public virtual ProductUnitType ProductUnitType { get; set; } 
} 
+0

https://docs.microsoft.com/en-us/ef/efcore-and-ef6/featuresによると、EFコアは遅延読み込みをサポートしていないため、答えは「いいえ」です。 – Eris

+0

ええ、私はそれがサポートされていませんが、明らかに上記のコードは遅延読み込みが動作することを知っています。インクルード関数を使用せずに、上記のコードを参照して関連オブジェクトにアクセスできます。それとも私はここで何か間違ったことを理解した? – superted

+0

エンティティが表示されないか、モデルの作成方法やコンテキストの作成方法などは分かりません。 – Eris

答えて

0

これは遅延ロードではありません。遅延ロードは、クエリの実行後に参照プロパティにアクセスできることを意味します。 product.ProductSizenullであることから、

var product = _context.Product.Find(1) 
var productSizeName = product.ProductSize.ProductSizeName 

はあなたに例外を与える:たとえば、あなたがid = 1でこのコードを、製品を持っていると仮定。これを修正するには、次の手順を実行する必要があります:

_context.Entry(product).Reference(x => x.ProductSize).Load() 

、その後:

var productSizeName = product.ProductSize.ProductSizeName 

あなたの例のようなクエリを作成中にproduct.ProductSizeを使用した場合、それはあなたを与えることはありませんエラーはinner joinを使用してデータを取得するためです。