LINQ to Entities не распознает метод Int32 - PullRequest
7 голосов
/ 23 июля 2010
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 ]

9 голосов
/ 23 июля 2010

Вы можете разбить ваш запрос на две части, чтобы убедиться, что список находится в памяти перед вызовом метода 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.

0 голосов
/ 31 июля 2013

Существует еще один простой способ.

Сначала загрузите данные из базы данных в память:

// ...
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 не поддерживает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...