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

Lỗi:LINQ to Entities không nhận ra phương pháp '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???

Trả lời

8

Bạn có thể chia truy vấn của bạn trong hai để đảm bảo danh sách là trong bộ nhớ trước khi gọi phương thức GetNumberOfDevices(). Bạn có thể tạo truy vấn trong bộ nhớ bằng cách chuyển đổi kết quả thành List hoặc trong trường hợp này là List<GetFreeDevices>. Bằng cách đó, LINQ to Entities không phải thực hiện bất kỳ bản dịch nào đến và từ XML và bạn có thể sử dụng phương thức GetNumberOfDevices() của mình.

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

Xin lưu ý rằng báo cáo kết quả cuối cùng đòi hỏi sự PartialView để chấp nhận một danh sách hoặc IEnumerable thay vì một IQueryable.

0

Có một cách dễ dàng khác.

Đầu tiên, tải dữ liệu từ cơ sở dữ liệu vào bộ nhớ:

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

query_view.Load(); 
// ... 

Sau đó, làm bất cứ điều gì bạn muốn với LINQ-to-đối tượng, không 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()); 

Bạn có thể sử dụng thủ thuật này cho bất kỳ phương thức nào mà L2E không hỗ trợ.