2010-09-16 28 views
6

में उप संग्रह प्राप्त करें मेरे पास एक LINQ से EF क्वेरी है जो क्लास फॉर्म में डेटा लौटाती है। कक्षा में List<RecipeCategories> संपत्ति है जिसे मुझे पॉप्युलेट करने की आवश्यकता है। पकाने की विधि कैटलॉग टेबल पकाने की विधि और पकाने की विधि श्रेणियों के बीच एक रिलेशनशिप टेबल है, और कई लोगों के लिए कई हो सकती है। कोड को संकलित करने के लिए मुझे पर्याप्त जानकारी मिली, लेकिन रनटाइम पर यह त्रुटियां और मैं यह समझने में सक्षम नहीं हूं कि यह अधिकार कैसे प्राप्त करें।सूची <class> फॉर्म

ri = (from r in recipeData.Recipes 
       where r.ID == recipeId 
       select new RecipeItem 
       { 
        Id = r.ID, 
        ProductId = r.Product.ID, 
        RecipeName = r.recipeName, 
        RecipeDescription = r.recipeDescription, 
        Servings = r.servings.HasValue ? r.servings.Value : 0, 
        CreatedDate = r.createdDate, 
        PrepTime = r.prepTime.HasValue ? r.servings.Value : 0, 
        CookTime = r.cookTime.HasValue ? r.servings.Value : 0, 
        Approved = r.approved, 
        RecipeInstructions = r.recipeInstructions, 
        RecipeIngredients = r.recipeIngredients, 
        RecipeCategories = r.RecipeCategories.Select(i => new RecipeCategoryItem { Id = i.ID, CategoryName = i.categoryName }).ToList() 
       }).First(); 

यह मुझे मिली त्रुटि है।

संस्थाओं को LINQ विधि को नहीं पहचानता है 'System.Collections.Generic.List 1[RecipeCategoryItem] ToList[RecipeCategoryItem](System.Collections.Generic.IEnumerable 1 [RecipeCategoryItem])' विधि, और इस विधि एक दुकान अभिव्यक्ति में अनुवाद नहीं किया जा सकता है।

जिस भाग पर मैं काम कर रहा हूं वह यह पंक्ति है।

RecipeCategories = r.RecipeCategories.Select(i => new RecipeCategoryItem { Id = i.ID, CategoryName = i.categoryName }).ToList() 

पकाने की विधि कैटेगरी List<RecipeCategoryItem> संपत्ति है।

क्या मैं संभव करने की कोशिश कर रहा हूं, और यदि हां, तो कैसे?

धन्यवाद।

उत्तर

11

आप एक बड़ी क्वेरी में जो हो जाता है उसके अंदर ToList को कॉल कर रहे हैं। कॉल को हटाएं। टोस्टिस्ट()।

समस्या यह है कि आपकी क्वेरी में सब कुछ एक बड़े अभिव्यक्ति पेड़ में बदल जाता है, जो इकाई फ्रेमवर्क SQL कथन में अनुवाद करने का प्रयास करता है। "ToList" का कोई SQL स्टैंडपॉइंट से कोई अर्थ नहीं है, इसलिए आपको इसे के अंदर कहीं भी कॉल नहीं करना चाहिए।

ज्यादातर मामलों में, आप यह सुनिश्चित करने के लिए कि क्वेरी का मूल्यांकन किया गया है और परिणाम स्मृति में लोड किए गए हैं, इसे वापस करने से पहले आप अपनी समग्र क्वेरी पर ToList को कॉल करना चाहते हैं। इस मामले में, आप केवल एक ऑब्जेक्ट लौट रहे हैं, इसलिए First पर कॉल अनिवार्य रूप से वही काम करता है।

यह कितना महत्वपूर्ण है कि पकाने की विधि List<RecipeCategoryItem> हो? यदि आप इसे इसके बजाय IENumerable बना सकते हैं, तो आप किसी भी समस्या के बिना ToList पर कॉल को हटा सकते हैं।

यदि यह बिल्कुल आवश्यक है कि आपके पास List है, तो आपको सबसे पहले प्रारंभिक इकाई फ्रेमवर्क क्वेरी और अनाम प्रकार (टोली को कॉल किए बिना) का उपयोग करने में सभी जानकारी खींचने की आवश्यकता होगी, और फिर ऑब्जेक्ट में प्राप्त डेटा को कनवर्ट करें टाइप करने से पहले आप चाहते हैं टाइप करें।

या आप बना सकते हैं अपने RecipeInfo कई प्रश्नों से टुकड़ों में आपत्ति है, तो जैसे:

var ri = (from r in recipeData.Recipes 
      where r.ID == recipeId 
      select new RecipeItem 
      { 
       Id = r.ID, 
       ProductId = r.Product.ID, 
       RecipeName = r.recipeName, 
       RecipeDescription = r.recipeDescription, 
       Servings = r.servings.HasValue ? r.servings.Value : 0, 
       CreatedDate = r.createdDate, 
       PrepTime = r.prepTime.HasValue ? r.servings.Value : 0, 
       CookTime = r.cookTime.HasValue ? r.servings.Value : 0, 
       Approved = r.approved, 
       RecipeInstructions = r.recipeInstructions, 
       RecipeIngredients = r.recipeIngredients, 
      }).First(); 
var rc = from c in recipeData.RecipeCategories 
     where c.Recipes.Any(r => r.ID == recipeId) 
     select new RecipeCategoryItem 
     { 
      Id = c.ID, CategoryName = c.categoryName 
     }; 
ri.RecipeCategories = ri.ToList(); 

ध्यान दें कि यह पिछले उदाहरण दो डेटाबेस यात्राओं का कारण होगा, लेकिन तार भर में भेजे जाने के लिए कम डेटा का कारण होगा।

+0

मैं पहले अपने दूसरा तरीका है, लेकिन सी कोशिश की थी।पकाने की विधि किसी भी क्षेत्र का पर्दाफाश नहीं करती है, और मुझे लगता है कि ऐसा इसलिए है क्योंकि संबंध तालिका वास्तव में डेटा मॉडल में दिखाई नहीं देती है क्योंकि यह व्यंजनों और नुस्खा श्रेणियों के बीच एक लिंक तालिका है। मैंने पहली बार कोशिश की, लेकिन मुझे यकीन नहीं है कि अब linq क्वेरी को कैसे व्यवस्थित किया जाए। यह वही है जो मेरे पास है। [कोड] पकाने की विधि श्रेणियां = आर। पकाने की विधि श्रेणियां। चयन करें (i => नई पकाने की विधि श्रेणी {आईडी = i.ID, श्रेणी नाम = i.categoryName}) [/ कोड] – Ben

+0

अंतिम टिप्पणी का समय समाप्त हो गया। मुझे यह त्रुटि मिलती है। IENumerable को पकाने की विधि नहीं बदल सकता है श्रेणी – Ben

+0

@बेन: यह व्यंजनों और पकाने की विधि की तरह लगता है श्रेणियों में कई से अधिक रिश्तों हैं, तो? मैंने तदनुसार अपना जवाब संपादित किया। मुझे बताएं कि वह आपके लिए कैसा रहा। मैंने पहली बार कहा था कि, आपको 'नया नुस्खा चुनें' '' 'नया चयन करने के लिए एक अज्ञात प्रकार का उपयोग करना होगा। फिर आपका दूसरा कदम इस अज्ञात वस्तु को लेना होगा और इसके डेटा के आधार पर एक नई पकाने की विधि बनाना होगा। – StriplingWarrior

2

मुझे लगता है कि मुझे समस्या का समाधान है। गतिशील प्रकार का प्रयोग करें।

public class BoxImageViewDetailDto 
{ 
    public Guid PropertyId { get; set; } 

    public string Title { get; set; } 
    public string SubTitle { get; set; } 
    public string Description { get; set; } 
    public string SubDescription { get; set; } 

    public decimal? PropertyValue { get; set; } 
    public byte? UnitsFloor { get; set; } 

    public dynamic ImagensRowsVar { get; set; } 
    public List<ImageViewDto> ImagensRows 
    { 
     get 
     { 
      return (List<ImageViewDto>)this.ImagensRowsVar; 
     } 
    } 

    public int ImagensRowsTotal { get; set; } 
} 

CorretorDaVez.DTO.UserControls.BoxImageViewDetailDto c = (from p in entities.rlt_Property 
    join pc in entities.rlt_PropertyPicture on p.PropertyId equals pc.PropertyId 
    where p.PropertyId == propertyId 
    orderby p.CreateDate descending 
    select new CorretorDaVez.DTO.UserControls.BoxImageViewDetailDto 
    { 
     PropertyId = p.PropertyId, 
     Title = p.Title, 
     PropertyValue = p.PropertyValue, 
     Description = p.Description, 
     UnitsFloor = p.UnitsFloor, 
     ImagensRowsTotal = p.rlt_PropertyPicture.Count, 
     ImagensRowsVar = p.rlt_PropertyPicture.Select(s => new CorretorDaVez.DTO.UserControls.ImageViewDto { PropertyId = p.PropertyId, ImagePath = pc.PhotoUrl}) 
    }).FirstOrDefault(); 
0

कोशिश:

 


    var ri = (from r in recipeData.Recipes 
       where r.ID == recipeId 
       select new RecipeItem 
       { 
        Id = r.ID, 
        ProductId = r.Product.ID, 
        RecipeName = r.recipeName, 
        RecipeDescription = r.recipeDescription, 
        Servings = r.servings.HasValue ? r.servings.Value : 0, 
        CreatedDate = r.createdDate, 
        PrepTime = r.prepTime.HasValue ? r.servings.Value : 0, 
        CookTime = r.cookTime.HasValue ? r.servings.Value : 0, 
        Approved = r.approved, 
        RecipeInstructions = r.recipeInstructions, 
        RecipeIngredients = r.recipeIngredients, 
        RecipeCategories = from rc in recipeData.RecipeCategories 
            where rc.Recipes.Any(r => r.ID == recipeId) 
            select new RecipeCategoryItem{ 
               Id = rc.ID, 
               CategoryName = rc.categoryName 
              } 
    ).First(); 


 
संबंधित मुद्दे