2013-11-01 11 views
12

Non riesco a capire perché sto ricevendo questo errore. Ho usato questa funzione con successo con le versioni precedenti di Entity Framework, ma ho impostato un nuovo progetto usando EF6 e non collabora.LINQ to Entities non riconosce il metodo '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 
     }; 

Quando eseguo questo io ottenere LINQ to Entities non riconosce il metodo di 'System.String StringConvert (System.Nullable`1 [System.Double])' metodo, e questo metodo non può essere tradotto in un'espressione di negozio.

n.RecID è una chiave primaria int sul tavolo in un database SQL (SQL Server Standard Edition)

Tutto quello che riesco a trovare con le ricerche sono le persone raccomandano StringConvert invece di ToString

AGGIUNTA - Analisi dello stack:

[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

E 'solo la mia immaginazione, o stai mettendo vista preoccupazioni (di generazione di codice HTML) nel vostro accesso ai dati? È un po '[puzzolente] (https://en.wikipedia.org/wiki/Code_smell). –

+0

@ tim-s Non so in quale altro modo farlo. Ciò che viene mostrato nel mio datalist dipende da quali dati vengono restituiti. Di certo non sono un programmatore esperto, quindi sarei felice di ricevere qualsiasi suggerimento. –

+0

@JenniferL non tutti i metodi di estensioni di linq sono supportati i pls vedono ..http: //msdn.microsoft.com/en-us/library/bb738550.aspx –

risposta

38

Ho avuto lo stesso problema e mi sono reso conto che stavo usando il tipo sbagliato di SqlFunctions. Assicurarsi che si è indicato il corretto spazio dei nomi:

using System.Data.Entity.SqlServer; 

e non:

using System.Data.Objects.SqlClient; 
+2

stessa cosa, ho ricevuto questo errore dopo l'aggiornamento a EF6 e funzionava dopo averlo modificato all'assemblaggio corretto. – hazimdikenli

+1

Questo deve essere successo quando EF è stato estratto dal framework .net standard e spostato in un assembly separato. È sfortunato. – recursive

+3

Questo dovrebbe essere contrassegnato come risposta corretta! –

1

non devi convertirlo in string, concatenazione di stringhe si prenderà cura di questo.

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

Non è necessario chiamare ToString.

+0

Ma l'eccezione dice che EF non riconosce 'StringConvert (double? value)'. Perché? Questo metodo esiste solo per l'esatto utilizzo. Cosa mi manca? – pescolino

+0

@pescolino, non sono sicuro, ma proverei a chiamarlo come 'SqlFunctions.StringConvert ((double?) N.RecID)' – Habib

+0

Grazie a @pescolino e @Habib! Ho provato a rimuovere StringConvert e ottenuto _Unable per eseguire il cast del tipo 'System.Int32' per digitare 'System.Object'. LINQ to Entities supporta solo il casting di tipi primitivi o di enumerazione EDM. Quando aggiungo il? dopo il doppio ottengo l'errore originale –

Problemi correlati