0

我的程序中有一个 Entity Framework 4 实体模型。我在 SQL Anywhere 12.0.1 数据库中定义了一个存储函数,名为GuidToPrefix

CREATE OR REPLACE FUNCTION GuidToPrefix( ID UNIQUEIDENTIFIER ) RETURNS INT AS
BEGIN
    RETURN CAST( CAST( ID AS BINARY(4) ) AS INT )
END;

按照这篇MSDN 文章中的说明,我将函数添加到我的 EDMX:

<Function Name="GuidToPrefix" ReturnType="int" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="DBA">
  <Parameter Name="ID" Type="uniqueidentifier" Mode="In" />
</Function>

老实说,我从数据库中更新了模型,并在向导的第一个选项卡上的列表中检查了函数。我不知道这是否会有所不同,但我不明白为什么会这样。

根据文章,我需要在 C# 类中添加函数的定义。我的问题是它没有告诉我该放在哪个类中。我要添加一个全新的类吗?我是否创建一个新的 .CS 文件并执行以下操作:

public static DbFunctions {

    [EdmFunction( "CarSystemModel.Store", "GuidToPrefix" )]
    public static int GuidToPrefix( Guid id ) {
        throw new NotSupportedException( "Direct calls to GuidToPrefix are not supported." );
    }
}

还是我把它放在实体类的一部分中?

partial MyEntities {

    [EdmFunction( "CarSystemModel.Store", "GuidToPrefix" )]
    public static int GuidToPrefix( Guid id ) {
        throw new NotSupportedException( "Direct calls to GuidToPrefix are not supported." );
    }
}

我有两个使用此实体模型的项目。一个是类库,模型在其中定义。另一个是另一个解决方案中的另一个类库,它只是使用它。我已经尝试了上面的两个示例,并且第二个类库中的查询在两种情况下都会从编译器生成此错误:

The name 'GuidToPrefix' does not exist in the current context

显然我做的不对。有没有人试过这个并让它工作?

4

1 回答 1

0

我找到了这个问题的答案。

回想一下,我在我的项目中创建了一个包含部分 MyEntities 类的文件,其中定义了实体模型:

partial MyEntities {

    [EdmFunction( "CarSystemModel.Store", "GuidToPrefix" )]
    public static int GuidToPrefix( Guid id ) {
        throw new NotSupportedException( "Direct calls to GuidToPrefix are not supported." );
    }
}

这很好,一切都编译好了。我的问题不在这里,而是在我必须使用该功能的项目中。

在那个项目中,在一个名为 的类中DataInterface,我有一个方法,代码如下:

var query = from read in context.Reads
            from entry in context.Entries
                                 .Where( e => GuidToPrefix( read.ID ) == e.PrefixID && read.ID == e.ID )
                 .....

问题是我需要在Where子句中添加包含 GuidToPrefix 函数的 C# 声明的类的名称。也就是说,我需要将上面的表达式写成:

var query = from read in context.Reads
            from entry in context.Entries
                                 .Where( e => MyEntities.GuidToPrefix( read.ID ) == e.PrefixID && read.ID == e.ID )
                 .....

这会编译,当它运行时,它会使用LEFT OUTER JOIN我想要的数据库中的函数。

于 2012-11-29T20:19:41.727 回答