2010-07-23 14 views
6
public ActionResult ReadXMLDevices(int groupID) 
{    
    var query = from k in XMLEntities.unassigneditems 
    where k.DevOrAcc == true && k.Group == groupID 
    select k; 

    var view_query = from i in query 
        select new GetFreeDevices 
        { 
         MArticleNumber = i.ArticleNumber, 
         MFirmware = i.Firmware, 
         MGroup = i.Group, 
         MName = i.Name, 
         MSoftware = i.SoftwareVersion, 
         SA = GetNumberOfDevices(i.ArticleNumber,2), 
         STH = GetNumberOfDevices(i.ArticleNumber,3), 
         SASTH = GetNumberOfDevices(i.ArticleNumber,7) 
        }; 
    return PartialView(view_query); 
} 

public int GetNumberOfDevices(string artNo,int loc) 
{ 
    var num_dev = (from k in XMLEntities.deviceview 
        where k.Reserved == false && k.Sold == false && k.LocationNameId == loc && k.ArticleNumber == artNo 
        select k).Count(); 
    return num_dev; 
} 

त्रुटि विधि 'को नहीं पहचानता है:LINQ Int32

LINQ to Entities does not recognize the method 'Int32 GetNumberOfDevices(System.String, Int32)' method, and this method cannot be translated into a store expression. How to resolve this???

उत्तर

8

आप दो में आपकी क्वेरी विभाजित कर सकते हैं यकीन है कि सूची GetNumberOfDevices() विधि कॉल करने से पहले में स्मृति है बनाने के लिए। आप परिणामों को List पर परिवर्तित करके, या इस मामले में List<GetFreeDevices> पर एक क्वेरी इन-मेमोरी बना सकते हैं। इस तरह, लिनक टू एंटिटीज को एक्सएमएल से और उसके लिए कोई अनुवाद नहीं करना पड़ता है और आप अपनी GetNumberOfDevices() विधि का उपयोग कर सकते हैं।

var view_query = (from i in query 
    select new GetFreeDevices 
    { 
     MArticleNumber = i.ArticleNumber, 
     MFirmware = i.Firmware, 
     MGroup = i.Group, 
     MName = i.Name, 
     MSoftware = i.SoftwareVersion 

    }).ToList(); 
var result_query = from i in query 
    select new GetFreeDevices 
    { 
     MArticleNumber = i.MArticleNumber, 
     MFirmware = i.MFirmware, 
     MGroup = i.MGroup, 
     MName = i.MName, 
     MSoftware = i.MSoftware, 
     SA = GetNumberOfDevices(i.MArticleNumber,2), 
     STH = GetNumberOfDevices(i.MArticleNumber,3), 
     SASTH = GetNumberOfDevices(i.MArticleNumber,7) 
    }; 
return PartialView(result_query); 

कृपया ध्यान दें कि पिछले बयान एक सूची या एक IQueryable के बजाय IEnumerable स्वीकार करने के लिए PartialView की आवश्यकता है।

0

एक और आसान तरीका है।

पहले, डेटाबेस से याद करने के लिए डेटा लोड:

// ... 
var query_view = from i in query 
       select i; 

query_view.Load(); 
// ... 

फिर, है जो कुछ भी आप LINQ करने वाली वस्तुओं, नहीं L2E साथ हैं:

var view_query_1 = from i in DbContext.myEntities.Local 
       select new GetFreeDevices 
       { 
        MArticleNumber = i.ArticleNumber, 
        MFirmware = i.Firmware, 
        MGroup = i.Group, 
        MName = i.Name, 
        MSoftware = i.SoftwareVersion, 
        SA = GetNumberOfDevices(i.ArticleNumber,2), // 
        STH = GetNumberOfDevices(i.ArticleNumber,3), // These are now ok! 
        SASTH = GetNumberOfDevices(i.ArticleNumber,7) // 
       }; 
    return PartialView(view_query_1.AsEnumerable()); 

आप के लिए इस चाल का उपयोग कर सकते कोई भी तरीका जो L2E का समर्थन नहीं करता है।