【问题标题】:Unable to run model defined function无法运行模型定义的功能
【发布时间】:2012-12-27 21:28:25
【问题描述】:

例外:

System.NotSupportedException:“Zx.Data.zxEntities”类型上的指定方法“Int32 CastToInt(System.String)”无法转换为 LINQ to Entities 存储表达式,因为调用它的实例不是评估使用它的查询的 ObjectContext。

.edmx 文件声明:

<!-- CSDL content -->
<edmx:ConceptualModels>
  <Schema Namespace="zxModel" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
  <!-- blah-blah-blah -->
  <Function Name="CastToInt" ReturnType="Edm.Int32" >
    <Parameter Name="p" Type="Edm.String" />
    <DefiningExpression>
      CAST (p AS Edm.Int32)
    </DefiningExpression>
  </Function>
  </Schema>
</edmx:ConceptualModels>

.Net 函数声明:

namespace Zx.Data
{
    using System;
    using System.Data.Objects;
    using System.Data.Objects.DataClasses;

    public partial class zxEntities  
    {
        [EdmFunction("zxModel", "CastToInt")]
        public int CastToInt(String p)
        {
            throw new NotSupportedException("This function is only for L2E query.");
        }
    }
}

调用函数:

var suppliers = entities.tblFirmPrice.Where(x => x.cat_Id == item.Cat_id)
    .Join(entities.Firms, fp => fp.frm_Id, f => f.Frm_Id,
        (fp, f) => new
        {
            fp.frm_Id,
            Price = fp.fp_FirmPrice,
            Discount = entities.tblFirmDiscount.Where(
                       x => entities.CastToInt(x.frm_id) == fp.frm_Id)
                       .OrderByDescending(x => x.fd_id)
                       .Select(x => x.fd_discount)
                       .FirstOrDefault(),
            PriceMarkup = entities.CastToInt(
                          SqlFunctions.StringConvert(f.Frm_IcsAdd))
        })
        .Select(x => new
        {
            x.frm_Id,
            Price = x.Price * (1 - ((((int?)x.Discount) ?? 0) / 100M)),
            x.PriceMarkup
        });

:-( 有什么建议吗?

P.S.:在编码时,使用了http://msdn.microsoft.com/en-us/library/dd456857.aspxhttp://msdn.microsoft.com/en-us/library/dd456857.aspx

【问题讨论】:

  • 做了一个临时测量 - 计算列,返回转换为 int 的所需数据。但在我看来这不是解决问题的好方法。

标签: linq entity-framework entity-framework-4 edmx


【解决方案1】:

您是否尝试过使用 Convert.ToInt32 方法?

Discount = entities.tblFirmDiscount.Where(
              x => Convert.ToInt32(x.frm_id) == fp.frm_Id)

【讨论】:

  • 错误消息为:LINQ to Entities 无法识别方法“Int32 ToInt32 (System.String)”,并且该方法无法转换为存储表达式。
  • @rmrfhome:另一种选择是做相反的事情,即将fp.frm_Id转换为string,然后与x.frm_id进行比较
  • 问题是 PriceMarkup = entity.CastToInt( SqlFunctions.StringConvert(f.Frm_IcsAdd)) 应该是更好的int,因为结果进一步参与联合(Frm_IcsAdd 是十进制)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
相关资源
最近更新 更多