2010-07-23 3 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; 
} 

Erreur:LINQ to Entities ne reconnaît pas la méthode « 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???

Répondre

8

Vous pouvez diviser votre requête en deux pour vous assurer que la liste est en mémoire avant d'appeler la méthode GetNumberOfDevices(). Vous pouvez effectuer une requête en mémoire en convertissant les résultats en List ou, dans ce cas, en List<GetFreeDevices>. De cette façon, LinQ to Entities ne doit effectuer aucune traduction de et vers XML et vous pouvez utiliser votre méthode 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); 

S'il vous plaît noter que la dernière déclaration nécessite l'PartialView d'accepter une liste ou IEnumerable au lieu d'un IQueryable.

0

Il existe un autre moyen facile.

En premier lieu, charger les données de base de données à la mémoire:

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

query_view.Load(); 
// ... 

Alors, faites ce que vous voulez avec LINQ à des objets, et non 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()); 

Vous pouvez utiliser cette astuce pour toutes les méthodes que L2E ne supporte pas.

Questions connexes