【发布时间】: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.aspx,http://msdn.microsoft.com/en-us/library/dd456857.aspx
【问题讨论】:
-
做了一个临时测量 - 计算列,返回转换为 int 的所需数据。但在我看来这不是解决问题的好方法。
标签: linq entity-framework entity-framework-4 edmx