LINQ to Entities не распознает метод ' Int32
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 ответов
вы можете разделить свой запрос на два, чтобы убедиться, что список находится в памяти перед вызовом GetNumberOfDevices()
метод. Вы можете сделать запрос в памяти, преобразовав результаты в List
, или в этом случае a List<GetFreeDevices>
. Таким образом, LinQ to Entities не нужно делать никаких переводов в XML и из 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
.
есть еще один простой способ.
сначала загрузите данные из базы данных в память:
// ...
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 не поддерживает.