Kann nicht in einen LINQ to Entities-Speicherausdruck übersetzt werden

Ich bin relativ neu in LINQ to Entities, benutze aber häufig LINQ to SQL.

Ich verwende Visual Studio 2013 mit EntityFramework 6 und MVC 5.

Der größte Unterschied zwischen beiden ist, dass Linq2SQL Konvertierungen innerhalb der SELECT-Abfrage selbst durchführen kann, während LINQ2Entities nicht so fehlerverzeihend ist und die richtige Konvertierung vorhanden sein muss, bevor die LINQ-Abfrage ausgeführt wird. Daher erhalte ich den Fehler:Die angegebene Methode 'System.Decimal ConvertToDecimal (Byte)' vom Typ 'BillYeagerDB.EdmxExtensionMethods' kann nicht in einen LINQ to Entities-Speicherausdruck übersetzt werden.

Nachdem ich mich intensiv mit Stackoveflow befasst hatte, entdeckte ich einen Link (LINQ to Entities erkennt die Methode 'Double Parse (System.String)' nicht und diese Methode kann nicht in einen Geschäftsausdruck übersetzt werden) das würde hoffentlich funktionieren. Ich bin sicher, dass das vom Autor angegebene Beispiel funktioniert, aber er hat mit dem ObjectContext gearbeitet, und ich arbeite mit dem DbContext.

Ich bin mir auch sicher, dass es für mich funktionieren wird, aber ich denke, ich entwerfe die Erweiterungsmethode nur falsch (was mir den obigen Fehler gibt). Beachten Sie, dass es sich bei diesem speziellen Problem um das Problem handeltAvgRating Variable in der Linq-Abfrage. Sobald dies funktioniert, kann ich die gleichen Korrekturen für alle anderen Konvertierungen vornehmen. Beachten Sie, dassAvgRating ist definiert als Typ Dezimal unda.Rating.RatingValue ist definiert als Typ Byte.

Wenn mich jemand aufklären kann, wäre ich sehr dankbar.

Hier ist mein Code. Ich versuche, die folgende Abfrage zu verwenden, von der ich weiß, dass sie (wie bereits erwähnt) aufgrund des Konvertierungsproblems nicht funktioniert.

Ursprüngliche LINQ-Abfrage:

namespace BillYeagerDB
{
    public class BillYeagerDB
    {
        public async Task<List<RestaurantList>> GetRestaurantListAsync()
        {
            try
            {
                using (BillYeagerEntities DbContext = new BillYeagerEntities())
                {
                    DbContext.Database.Connection.Open();

                    var restaurants = await DbContext.Restaurants.GroupBy(g => g).Select(s =>
                        new RestaurantList()
                        {
                            Name = s.Key.Name,
                            City = s.Key.City,
                            Phone = s.Key.Phone,
                            AvgRating = s.Average(a => Convert.ToDecimal(a.Rating.RatingValue)),
                            NbrOfPeopleRating = s.Distinct().Count(c => Convert.ToBoolean(c.RatingId)),
                            Id = s.Key.Id
                        }).ToListAsync();

                    return restaurants;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
}

Update, das ich an meiner EDMX-Datei durchführen musste

<edmx:ConceptualModels>
      <Schema Namespace="BillYeagerModel" Alias="Self" annotation:UseStrongSpatialTypes="false" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
        <Function Name="ParseDecimal" ReturnType="Edm.Decimal"> 
            <Parameter Name="bytevalue" Type="Edm.Byte" /> 
            <DefiningExpression> 
                cast(bytevalue as Edm.Decimal)
            </DefiningExpression> 
        </Function>

C # -Erweiterungsmethode, die eine Klasse im Stammverzeichnis meines Projekts ist - nicht in meinem EDMX

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;

namespace BillYeagerDB
{
    public partial class EdmxExtensionMethods : DbContext
    {
        [DbFunctionAttribute("BillYeagerDB", "ParseDecimal")]
        public static Decimal ParseDecimal(byte bytevalue)
        {
            return Convert.ToDecimal(bytevalue);
        }
    }
}

Aktualisierte Linq-Abfrage - Keine Fehler beim Kompilieren der Entwurfszeit und das Projekt wurde erfolgreich kompiliert

namespace BillYeagerDB
{
    public class BillYeagerDB
    {
        public async Task<List<RestaurantList>> GetRestaurantListAsync()
        {
            try
            {
                using (BillYeagerEntities DbContext = new BillYeagerEntities())
                {
                    DbContext.Database.Connection.Open();

                    var restaurants = await DbContext.Restaurants.GroupBy(g => g).Select(s =>
                        new RestaurantList()
                        {
                            Name = s.Key.Name,
                            City = s.Key.City,
                            Phone = s.Key.Phone,
                            AvgRating = s.Average(a => EdmxExtensionMethods.ConvertToDecimal(a.Rating.RatingValue)),
                            NbrOfPeopleRating = s.Distinct().Count(c => Convert.ToBoolean(c.RatingId)),
                            Id = s.Key.Id
                        }).ToListAsync();

                    return restaurants;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage