如何从MetadataWorkspace中仅提取存储过程?

时间:2011-02-22 17:06:18

标签: entity-framework entity-framework-4

伙计们,有没有办法从MetadataWorkspace的存储模型(SSDL)中提取存储过程?

目前,我使用以下代码从MetadataWorkspace中提取存储过程(我正在检查EdmFunction对象的BuiltInAttribute):

public static List<EdmFunction> TryGetSsdlFunctions( this MetadataWorkspace metadataWorkspace )
{
    List<EdmFunction> functions = new List<EdmFunction>();

    foreach ( EdmFunction function in metadataWorkspace.GetItems<EdmFunction>( DataSpace.SSpace ) )
    {
        MetadataProperty builtInAttribute = function.MetadataProperties.FirstOrDefault( p => p.Name == "BuiltInAttribute" );
        if ( builtInAttribute != null && Convert.ToBoolean( builtInAttribute.Value.ToString() ) == false )
        {
            functions.Add( function );
        }
    }

    return functions;
}

这里的问题是,除了存储过程之外,这将返回数据模型中包含的所有函数。我只想存储过程。我发现IsComposable属性的值存在差异,但我不确定这是否是一个可靠的标准。

提前致谢。

p.s:如果您认为有更智能的方法从工作区中提取存储过程,请分享。

2 个答案:

答案 0 :(得分:1)

这个变种怎么样?

public static List<EdmFunction> TryGetSsdlFunctions( this MetadataWorkspace metadataWorkspace ) { 
  List<EdmFunction> functions = (from func in metadataWorkspace.GetItems<EdmFunction>(DataSpace.SSpace) )
                                where func.ReturnParameter == null
                                select func).ToList();
  return functions;
}

答案 1 :(得分:1)

我最近也需要找到它。应使用IsComposable属性来确定EdmFunction是存储过程还是用户定义函数。

  

EdmFunction.IsComposableAttribute Property

     

获取或设置此实例是映射到函数还是映射到存储过程。

     

物业价值

     

类型:System.Boolean

     如果此实例映射到函数,则

true ;如果此实例映射到存储过程,则 false

     

版本信息

     

.NET Framework

     

自4.5以来可用

https://msdn.microsoft.com/en-us/library/system.data.metadata.edm.edmfunction.iscomposableattribute(v=vs.110).aspx

(我知道这是一个老问题,但这是我在搜索答案时谷歌的最佳结果。也许这会帮助其他人。)