LINQ

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; 
} 

Hata Int32 yöntemi' tanımıyor:LINQ

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???

cevap

8

emin liste GetNumberOfDevices() yöntemini çağırmadan önce bellek yapmak için ikiye Sorgunuzla bölebilirsiniz. Bir List sonuçları dönüştürerek bellek içi bir sorgu yapmak, veya bu durumda bir List<GetFreeDevices> içinde olabilir. Bu şekilde, varlıkları için LinQ ve XML ile gelen herhangi bir çeviri yapmak zorunda değildir ve siz GetNumberOfDevices() yöntemi kullanabilirsiniz.

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); 

son deyimi bir liste veya yerine IQueryable ait IEnumerable kabul etmek PartialView gerektirdiğini unutmayınız.

0

başka kolay bir yolu yoktur.

Birincisi, veritabanından belleğe veri yüklemek: Sonra

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

query_view.Load(); 
// ... 

, her ne linq-to-nesneler değil, L2E ile istiyorsun:

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()); 

Sen için bu hileyi kullanabilirsiniz L2E desteklemeyen herhangi yöntemleri.