Ошибка при вызове функции из запроса linq - PullRequest
1 голос
/ 30 сентября 2011

Здесь код, который я написал, я получаю ошибку, как только я добавил строку для вызова второй функции, которая ValidCodes = GetValidCodes(bv.Variable_Id)

public IQueryable<BvIndexRow> GetBenefitVariableIndex(int healthPlanId)
{
    var q = from bv in Db.BenefitVariables
            where bv.Private == "N" || (bv.Private == "Y" && bv.Health_Plan_ID == healthPlanId)
            join bao in Db.baObject on bv.Variable_Id equals bao.ba_Object_id
            join servicetype in Db.BenefitVariableServiceTypes.Where(bvst => bvst.Key_Service_Type == "Y" && bvst.isActive == 1) 
            on bv.Variable_Id equals servicetype.Variable_Id into groupedBvst
            where bv.isActive == 1 && bao.isActive == 1 
            from bvst in groupedBvst.DefaultIfEmpty()
            select new BvIndexRow
            {
                // some code here too
                ValidCodes = GetValidCodes(bv.Variable_Id)
            };
    return q;
}

public string GetValidCodes(int varID)
{
    // some code here
    return "None";
}

Ответы [ 2 ]

2 голосов
/ 30 сентября 2011

Другой автор ответил, почему, но не что делать. Причина в том, что вызов метода не может быть преобразован Linq-to-SQL в SQL, поскольку он ... не является частью SQL! Это имеет смысл! Итак, простой способ исправить это:

public IQueryable<BvIndexRow> GetBenefitVariableIndex(int healthPlanId)
{
   var q = (... your query ...
      select new BvIndexRow
      {
         Type = (bv.Private.ToLower() == "y" ? "Private " : "Public ") + (bao.ba_system_variable_ind ? "System" : "Benefit"),
         Class = bv.Variable_Classification,
         ServiceType = bvst.Service_Type.Service_Type_Name ?? string.Empty,
         LineOfBusiness = bv.LOB,
         Status = bv.Status.ToLower() == "p" ? "Production" : "Test",
         Name = bao.ba_object_Code,
         Description = bao.ba_Object_Desc,
         Id = bv.Variable_Id,
      }).ToArray();

   foreach (var bvIndexRow in q) {
      bvIndexRow.ValidCodes = GetValidCodes(bvIndexRow .Variable_Id);
   }

   return q;
}

Это должно дать вам, что вы хотите!

РЕДАКТИРОВАТЬ: Кстати, вы, вероятно, также хотите вызвать .ToList () или .ToArray () в вашем списке BvIndexRows. Это приводит к немедленной оценке и предотвращает многократное перечисление. Если вы не хотите немедленной оценки, вам, возможно, придется изменить свой вопрос, чтобы объяснить, почему это так. Я добавил .ToArray () в приведенный выше пример, но я также хотел объяснить, почему!

2 голосов
/ 30 сентября 2011

Linq to Sql не может разрешить вызов метода GetValidCodes(..) в операцию в контексте базы данных - вам нужно будет заполнить это свойство, как только вы вернете свои результаты в память, или, альтернативно, заполнить соответствующий linq to sqlзаявления непосредственно.

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