首页 文章

LINQ to Entities无法识别方法'Int32

提问于
浏览
7
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 to Entities无法识别方法'Int32 GetNumberOfDevices(System.String,Int32)'方法,并且此方法无法转换为存储表达式 . 怎么解决这个???

2 回答

  • 0

    您可以将查询拆分为两个,以确保在调用 GetNumberOfDevices() 方法之前列表在内存中 . 您可以通过将结果转换为 List ,或者在本例中为 List<GetFreeDevices> 来在内存中进行查询 . 这样,LinQ to Entities不必对XML进行任何翻译,您可以使用 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);
    

    请注意,最后一个语句要求PartialView接受列表或 IEnumerable 而不是 IQueryable .

  • 9

    还有另一种简单的方法 .

    首先,将数据从数据库加载到内存:

    // ...
    var query_view = from i in query
                     select i;
    
    query_view.Load();
    // ...
    

    然后,使用linq-to-objects做任何你想做的事情,而不是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不支持的任何方法 .

相关问题