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

error:LINQ a Entidades no reconoce el método '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???

Respuesta

8

Se puede dividir la consulta en dos para asegurarse de que la lista es en memoria antes de llamar al método GetNumberOfDevices(). Puede realizar una consulta en memoria convirtiendo los resultados a List, o en este caso a List<GetFreeDevices>. De esta manera, LinQ to Entities no tiene que hacer ninguna traducción ay desde XML y puede usar su método 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); 

Tenga en cuenta que la última afirmación requiere la PartialView para aceptar una lista o IEnumerable en lugar de un IQueryable.

0

Hay otra manera fácil.

En primer lugar, cargar los datos de la base de datos a la memoria:

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

query_view.Load(); 
// ... 

Luego, hacer lo que quiera con LINQ a objetos, no 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()); 

Usted puede usar este truco para cualquier método que L2E no sea compatible.

Cuestiones relacionadas