2013-04-15 1 views
2

Я пытаюсь связать многие таблицы с помощью LINQ Lambda, но у меня возникает проблема при работе с подзапросом, чтобы получить значение для свойства ProducedBy. Я получаю сообщение: Этот метод не поддерживается в отношении результата материализованного запроса.Этот метод не поддерживается в отношении результата материализованного запроса

Может дать мне руку?

  var temp = db.MK_Product_Variant 
       .Join(db.MK_Products, a => a.ProductId, b => b.ID, (a, b) => new { a, b }) 
       .Join(db.MK_Product_Category, c => c.b.CategoryId, d => d.ID, (c, d) => new { c, d }) 
       .Join(db.MK_Game_Type, e => e.d.GameType, f => f.ID, (e, f) => new { e, f }) 
       .Where(g=> !db.MK_MP_Variant.Select(h=>h.ID).Contains(g.e.c.a.ID)) /* My Store only */ 
       .Select(i => new { 
        Category = i.e.d.Name, 
        ItemType = i.f.Name, 
        ItemNo = i.e.c.a.ID, 
        Enabled = i.e.c.b.Enabled, 
        Status = "", 
        ProducedBy = (db.MK_Products.Join(db.MK_Production_Resource,k=>k.ID,l=>l.Item,(k,l) => new {k,l}) 
        .Join(db.MK_Production_Staff,m=>m.l.Staff,n=>n.ID,(m,n) => new {m,n}) 
        .Where(o => o.m.k.ID == i.e.c.a.ID) 
        .Select(p=>p.n.Location).DefaultIfEmpty("").ToList())[0], 
        ReleaseDate = i.e.c.a.ReleaseDate, 
        ReleasingQty = i.e.c.a.Qty, 
        Price = i.e.c.a.Price_MKD, 
        QtyPurchaseFromUser = "", 
        QtySold = db.MK_Product_VariantHistory.Where(j => j.Variant == i.e.c.a.ID && j.PurchaseDate >= startDate && j.PurchaseDate <= stopDate && !(db.MK_MP_Variant.Select(t => t.ID)).Contains(i.e.c.a.ID)).Count() 
       }); 

и это строка кодов, где я хочу, чтобы использовать его:

  int count = 0; 

      foreach (var item in temp) 
      { 
       result.Add(count, new string[] { item.Category, item.ItemType, item.ItemNo.ToString(), item.Enabled.ToString(), "", item.ProducedBy.Count()==0?"":item.ProducedBy.FirstOrDefault().Country , string.Format("{0:yyyy-MM-dd hh:mm:ss tt}", item.ReleaseDate), "", "", item.ReleasingQty.ToString(), "", item.QtySold.ToString(), item.QtyPurchaseFromUser.ToString(), string.Format("{0:#0}", item.Price), "", "", "", "", "" }); 

       count++; 
      } 

ответ

1

, где у вас есть select, после where заявления, вы возвращаете анонимный тип в select заявлении, которое имеет свойство с именем ProducedBy, чтобы установить это свойство, вы написали запрос и, наконец, позвонили ToList, чтобы получить первый элемент ... вам нужно использовать FirstOrDefault вместо ToList() и получить нулевой индексный элемент следующим образом:

ProducedBy = db.MK_Products 
      .Join(db.MK_Production_Resource,k=>k.ID,l=>l.Item,(k,l) => new {k,l}) 
      .Join(db.MK_Production_Staff,m=>m.l.Staff,n=>n.ID,(m,n) => new {m,n}) 
      .Where(o => o.m.k.ID == i.e.c.a.ID) 
      .Select(p=>p.n.Location) 
      .DefaultIfEmpty("") 
      .FirstOrDefault() 

вы не можете назвать ToList среди LINQ к сущности, если ваша дата не быть извлечена в память раньше, если вы хотите, чтобы заполнить список среди LINQ к сущности в мастер подробно случае, вы можете использовать AsEnumerable вместо

Смежные вопросы