从Linq Query

时间:2016-03-12 21:39:06

标签: sql linq function edmx scalar

这里有很多类似的线程,但没有一个不能解决我的问题。

据我所知,有两种方法可以从linq调用SQL标量函数。

1。方法:

我已使用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.Nullable 1[System.Int32], System.Nullable 1 [System.Int32])'方法,这个方法不能   翻译成商店表达。

2。方法:

我已使用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”,但它给了我这个错误:

  

无法编写声明命令文本的函数。

你可以帮我解决这个问题!? 非常感谢提前!!

::欢呼::

约瑟普布罗兹

1 个答案:

答案 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--;
    }
}   

这样调用标量函数就可以了,我们可以从结果中删除匹配的记录!

希望这会对某人有所帮助。

::干杯::

约瑟普布罗兹