2013-11-01 59 views
12

我找不出爲什麼我得到這個錯誤。我已經在以前版本的Entity Framework中成功地使用了這個函數,但是我已經使用EF6建立了一個新項目,並且它不合作。LINQ to Entities無法識別方法'System.String StringConvert(System.Nullable`1 [System.Double])

using System.Data; 
using System.Data.Objects.SqlClient; 

e.Result = from n in MyDB.tblBulletins 
    where n.AnncStart <= DateTime.Now && n.AnncEnd > DateTime.Now && n.Approved == true 
    orderby n.AnncStart descending, n.AnncDate descending 
    select new 
    { 
     n.RecID, 
     AnncTitle = n.AnncTitle + " <a href='bulletinAdd.aspx?ID=" + SqlFunctions.StringConvert((double)n.RecID).Trim() + "'><Edit></a>", 
     AnncText = (n.AnncImg == null ? n.AnncText : "<a href='images/bulletin/" + n.AnncImg + "'><img src='images/bulletin/" + n.AnncImg + "' class='stickyphoto' alt='Click for larger image'/></a>" + n.AnncText), 
     Email = (n.Email == null ? "" : "<br/><a href='mailto:" + n.Email + "'>" + n.Email + "</a>"), 
     n.AnncType, 
     n.AnncDate, 
     n.AnncEnd, 
     n.v_EmpBasicInfo.Name 
     }; 

當運行此我得到 LINQ實體無法識別方法「System.String StringConvert(System.Nullable`1 [System.Double])」方法,和這種方法不能被翻譯成商店表達。

n.RecID是在SQL數據庫上表的int主鍵(SQL Server標準版)

我只能通過似乎搜索找到的人推薦的,而不是的ToString

加成StringConvert - 堆棧跟蹤:

[NotSupportedException: LINQ to Entities does not recognize the method 'System.String StringConvert(System.Nullable`1[System.Double])' method, and this method cannot be translated into a store expression.] 
System.Data.Entity.Core.Objects.ELinq.DefaultTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) +194 
System.Data.Entity.Core.Objects.ELinq.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) +976 
System.Data.Entity.Core.Objects.ELinq.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) +88 
System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) +148 
System.Data.Entity.Core.Objects.ELinq.BinaryTranslator.TypedTranslate(ExpressionConverter parent, BinaryExpression linq) +122 
System.Data.Entity.Core.Objects.ELinq.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) +88 
System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) +148 
System.Data.Entity.Core.Objects.ELinq.BinaryTranslator.TypedTranslate(ExpressionConverter parent, BinaryExpression linq) +87 
System.Data.Entity.Core.Objects.ELinq.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) +88 
System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) +148 
System.Data.Entity.Core.Objects.ELinq.NewTranslator.TypedTranslate(ExpressionConverter parent, NewExpression linq) +520 
System.Data.Entity.Core.Objects.ELinq.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) +88 
System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) +148 
System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input) +168 
System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input, DbExpressionBinding& binding) +160 
System.Data.Entity.Core.Objects.ELinq.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, DbExpressionBinding& sourceBinding, DbExpression& lambda) +168 
System.Data.Entity.Core.Objects.ELinq.SelectTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) +70 
System.Data.Entity.Core.Objects.ELinq.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod) +47 
System.Data.Entity.Core.Objects.ELinq.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) +141 
System.Data.Entity.Core.Objects.ELinq.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) +88 
System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) +148 
System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.Convert() +50 
System.Data.Entity.Core.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption) +563 
System.Data.Entity.Core.Objects.<>c__DisplayClassb.<GetResults>b__a() +83 
System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction(Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess) +499 
System.Data.Entity.Core.Objects.<>c__DisplayClassb.<GetResults>b__9() +271 
System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Func`1 operation) +251 
System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) +600 
    System.Data.Entity.Core.Objects.ObjectQuery`1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0() +89 
System.Lazy`1.CreateValue() +416 
System.Lazy`1.LazyInitValue() +152 
System.Lazy`1.get_Value() +75 
System.Data.Entity.Internal.LazyEnumerator`1.MoveNext() +40 
System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +381 
System.Linq.Enumerable.ToList(IEnumerable`1 source) +58 

[TargetInvocationException: Exception has been thrown by the target of an invocation.] 
System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) +0 
System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) +92 
System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +108 
System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) +19 
System.Web.UI.WebControls.QueryableDataSourceHelper.ToList(IQueryable query, Type dataObjectType) +225 
System.Web.UI.WebControls.LinqDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments) +549 
System.Web.UI.WebControls.Repeater.GetData() +55 
System.Web.UI.WebControls.Repeater.CreateControlHierarchy(Boolean useDataSource) +89 
System.Web.UI.WebControls.Repeater.OnDataBinding(EventArgs e) +61 
System.Web.UI.WebControls.Repeater.DataBind() +105 
System.Web.UI.WebControls.Repeater.EnsureDataBound() +49 
System.Web.UI.WebControls.Repeater.OnPreRender(EventArgs e) +15 
System.Web.UI.Control.PreRenderRecursiveInternal() +83 
System.Web.UI.Control.PreRenderRecursiveInternal() +168 
System.Web.UI.Control.PreRenderRecursiveInternal() +168 
System.Web.UI.Control.PreRenderRecursiveInternal() +168 
System.Web.UI.Control.PreRenderRecursiveInternal() +168 
System.Web.UI.Control.PreRenderRecursiveInternal() +168 
System.Web.UI.Control.PreRenderRecursiveInternal() +168 
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +974 
+0

難道只是我的想象,或者是你把視圖關注(HTML代碼生成)到您的數據訪問?這有點[臭](https://en.wikipedia.org/wiki/Code_smell)。 –

+0

@ tim-s我不知道該怎麼做。我的datalist中顯示的內容取決於返回的數據。我當然不是主程序員,但我歡迎任何建議。 –

+0

@JenniferL並非所有的linq extenstions方法都支持請參閱..http://msdn.microsoft.com/en-us/library/bb738550.aspx –

回答

38

我有同樣的問題,並意識到我使用了錯誤類型的SqlFunctions。請確保您引用正確的命名空間:

using System.Data.Entity.SqlServer; 

,而不是:

using System.Data.Objects.SqlClient; 
+2

同樣的事情,升級到EF6後,我得到這個錯誤,並且它改變到正確的程序集後工作。 – hazimdikenli

+1

EF從標準.net框架中提取並轉移到單獨的程序集時,肯定發生了這種情況。這很不幸。 – recursive

+3

這應該被標記爲正確答案! –

1

你不必把它轉換爲string,字符串連接將採取照顧。

AnncTitle = n.AnncTitle + " <a href='bulletinAdd.aspx?ID=" + n.RecID + "'><Edit></a>", 

您不必致電ToString以及。

+0

但是例外說EF不識別'StringConvert(double?value)'。爲什麼?此方法僅用於確切的用途。我錯過了什麼? – pescolino

+0

@pescolino,我不確定,但我會嘗試調用像'SqlFunctions.StringConvert((double?)n.RecID)' – Habib

+0

感謝@pescolino和@Habib!我試圖刪除StringConvert並得到_Unable來投入類型'System.Int32'鍵入'System.Object'。 LINQ to Entities僅支持投射EDM基元或枚舉類型。當我添加?雙重後,我得到了原來的錯誤 –

相關問題