这里有很多类似的线程,但没有一个不能解决我的问题。
据我所知,有两种方法可以从linq调用SQL标量函数。
我已使用XML编辑器将我的函数添加到.edmx文件中,我的功能是:
<Function Name="prisustvoPostotci" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
<CommandText>
select dbo.prisustvoPostotci(@matica_ID,@godina)
</CommandText>
<Parameter Name="matica_ID" Type="int" Mode="In" />
<Parameter Name="godina" Type="int" Mode="In" />
</Function>
我转到模型浏览器并在功能导入和将返回集合类型更改为Int32 时双击我的功能。我的函数返回整数。
现在我可以使用以下方法从linq调用我的函数:
using (DB_Entities dm = new DB_Entities())
{
dm.prisustvoPostotci(1, 2016).FirstOrDefault();
}
返回有效的整数值!
但是如果我从Linq Query中调用我的函数:
query = query.Where(x => x.date.Value.Year == max_year &&
dm.prisustvoPostotci(x.ID, max_year).FirstOrDefault() >= 50);
会抛出此错误:
LINQ to Entities无法识别该方法 “System.Data.Entity.Core.Objects.ObjectResult
1[System.Nullable
1 [System.Int32]] prisustvoPostotci(System.Nullable1[System.Int32], System.Nullable
1 [System.Int32])'方法,这个方法不能 翻译成商店表达。
我已使用XML编辑器将我的函数添加到.edmx文件中,我的功能是:
<Function Name="prisustvoPostotci" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
<CommandText>
select dbo.prisustvoPostotci(@matica_ID,@godina)
</CommandText>
<Parameter Name="matica_ID" Type="int" Mode="In" />
<Parameter Name="godina" Type="int" Mode="In" />
</Function>
我转到模型浏览器并在功能导入和将返回集合类型更改为Int32 时双击我的功能。我的函数返回整数。
然后我创建了一个分部类并编写了这个方法:
public static class EntityFunctions
{
[EdmFunction("Model.Store", "prisustvoPostotci")]
public static int prisustvoPostotci(int matica_ID, int godina)
{
throw new NotSupportedException("Direct calls not supported");
}
}
“Model.Store”是从我的.edmx文件中的Schema Namespace读取的Model Store的正确名称。
现在,如果我使用:
从linq调用我的函数EntityFunctions.prisustvoPostotci(119, 2016).ToString()
会抛出此错误:
抛出新的NotSupportedException(“不支持直接调用”);
另外,如果我从Linq Query调用我的函数,如下所示:
query = query.Where(x => x.date.Value.Year == max_year &&
EntityFunctions.prisustvoPostotci(x.ID, max_year) >= 50);
会抛出此错误:
函数或函数import'Mode.Store.prisustvoPostotci'不可组合。无法在查询表达式中调用不可组合的函数或函数导入。
我尝试编辑我的.edmx文件并更改属性IsComposable =“true”,但它给了我这个错误:
你可以帮我解决这个问题!? 非常感谢提前!!无法编写声明命令文本的函数。
::欢呼::
约瑟普布罗兹
答案 0 :(得分:0)
感谢Gerd Arnold我意识到标量函数不能在查询where语句中使用。
以下是我通过调用查询外的标量函数来设法过滤查询的方法:
var result = query.ToList();
for (int i = 0; i < result.Count; i++)
{
// prisustvoPostotci(ID, year) is my scalar function
if (dm.prisustvoPostotci(result[i].ID, max_year).FirstOrDefault() >= 50)
{
result.Remove(result[i]);
i--;
}
}
这样调用标量函数就可以了,我们可以从结果中删除匹配的记录!
希望这会对某人有所帮助。
::干杯::
约瑟普布罗兹