2011-05-03 45 views
14

我爲我的數據庫對象生成實體代碼塊並選擇一些用戶定義的標量函數。但是當我試圖在Model.Store中導入函數時雙擊功能,我得到這個錯誤。無法爲可組合函數創建函數導入

無法爲可組合函數創建函數導入。

如何導入我的功能?

+0

什麼是返回類型?如果你有複雜的返回類型,這可能會有所幫助 - http://blogs.msdn.com/b/nihitk/archive/2010/04/23/ado-net-entity-designer-in-vs-2010-stored-procedure -return-type-shape-sensing.aspx – VinayC 2011-05-03 08:36:30

+0

varchar(100)不是一個複雜的類型,我猜... – Helio 2011-05-03 08:47:54

回答

8

我不知道我看到與ExecuteFunction,但它不工作。在post和其他回覆中顯示的文章的幫助下,我終於得到了一個端到端的解決方案。

第一步是讓功能到您的EDMX文件:

<Function Name="ProcessReplacements" ReturnType="nvarchar(max)" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="Data"> 
     <Parameter Name="VersionId" Type="uniqueidentifier" Mode="In" /> 
     <Parameter Name="SurveyId" Type="uniqueidentifier" Mode="In" /> 
     <Parameter Name="Input" Type="nvarchar(max)" Mode="In" /> 
    </Function> 

第二步是建立在相同的命名空間EDMX文件中的類(很容易在同一目錄下創建類完成EDMX文件:

using System.Data.Objects.DataClasses; 
namespace Same.As.Edmx 
{ 
    public static class EdmFunctions 
    { 
     [EdmFunction("SurveyDesignerModel.Store", "ProcessReplacements")] 
     public static string ProcessReplacements(Guid VersionId, Guid SurveyId, string Input) 
     { 
      throw new NotSupportedException("Direct calls are not supported."); 
     } 
    } 
} 

第三步是寫一個對象查詢指着功能:

using System.Data.Objects; 
    protected string ProcessReplacements(Guid versionId, Guid surveyId, string input) 
    { 
     if (input == null) 
      return null; 

     List<ObjectParameter> parameters = new List<ObjectParameter>(3); 
     parameters.Add(new ObjectParameter("VersionId", versionId)); 
     parameters.Add(new ObjectParameter("SurveyId", surveyId)); 
     parameters.Add(new ObjectParameter("Input", input)); 

     var output = db.CreateQuery<string>("SurveyDesignerModel.Store.ProcessReplacements(@VersionId, @SurveyId, @Input)", parameters.ToArray()) 
      .Execute(MergeOption.NoTracking) 
      .FirstOrDefault(); 

     return output; 
    } 

對我來說,關鍵是CreateQuery對「查詢字符串」的對象上下文和語法的調用。請注意EDMX中定義的功能的完全限定參考,這是我缺少的鏈接:-)

+0

有沒有辦法在EntityDataSource的CommandText屬性的SQL語句中使用這種導入的函數? – Mikhail 2012-08-24 07:37:22

+0

哇,實際上,它是:http://www.scip.be/index.php?Page=ArticlesNET35#CallingSqlClrAggregatesLinqToEntities – Mikhail 2012-08-24 08:08:55

+0

這是一些很好的信息,但是,我不需要做你的第二步...只是第三步爲我做了。 – bsara 2013-01-24 20:01:34

3

這是正確的。您不能爲SQL函數創建函數導入,但僅適用於SQL存儲過程。您可以導入SQL函數存儲模式,但你必須手動創建方法調用該函數:

public static class EdmFunctions 
{ 
    [EdmFunction("TestModel.Store", "FunctionName")] 
    public static string SomeName(string someParam) 
    { 
     throw new NotSupportedException("This function is only for L2E query."); 
    } 
} 

命名空間中EdmFunction必須是存儲容器的命名空間(SSDL在EDMX文件)和名稱必須是名導入的功能。在.NET代碼中調用此方法時沒有任何意義。因爲它拋出異常。只有將查詢轉換爲SQL = linq-to-entities。

+0

我已經使用了這種方法,但它似乎沒有工作。這是我做了什麼: 公共靜態類EdmFunctions { [EdmFunction( 「Model.Store」, 「PKG_TURNUS_SUMUKE」) 公共靜態INT turnusSumuke(十進制ALNR,小數ATID,小數AUKENR) { 拋出新NotSupportedException異常(「此功能僅用於L2E查詢。」); } } 我從L2E調用了這個函數,但查詢返回null。 – 2011-06-01 12:04:06