【问题标题】:Error while calling function from linq query从 linq 查询调用函数时出错
【发布时间】:2011-09-30 17:41:22
【问题描述】:

这里是我写的代码,一旦我添加了调用第二个函数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";
}

【问题讨论】:

  • 您遇到什么错误?您能否以更易读的格式重新发布代码,去掉与问题无关的行?
  • 我不知道为什么我的问题得到了 -ve 票。请大家理解并及时回复。
  • @NetDev 我也不确定你为什么这样做,我今天显然已经投票了很多并且已经达到了我的极限,但我会尝试消除其他人的鲁莽。我认为这是由于格式(您已修复)。您提出的问题涉及 LINQ-to-SQL 的基本部分,新手很容易忽略该部分。我当然认为它很有用!

标签: c# linq linq-to-sql generics


【解决方案1】:

另一位发帖人已经回答了原因,但没有回答该做什么。为什么方法调用不能被 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;
}

这应该给你想要的!

编辑:顺便说一句,您可能还想在 BvIndexRows 列表上调用 .ToList() 或 .ToArray()。这具有导致立即评估的效果,并将防止多重枚举。如果您不想立即评估,您可能需要编辑您的问题以解释为什么会这样。我在上面的示例中添加了一个 .ToArray(),但我也想解释一下原因!

【讨论】:

    【解决方案2】:

    Linq to Sql 无法将方法调用 GetValidCodes(..) 解析为数据库上下文中的操作 - 将结果带回内存后,您必须填写该属性,或者填写相应的 linq to sql直接声明。

    【讨论】:

      猜你喜欢
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-17
      相关资源
      最近更新 更多