Nie można przetłumaczyć na wyrażenie sklepu LINQ na elementy

Jestem stosunkowo nowy w LINQ do Entities, ale często używam LINQ do Sql.

Korzystam z Visual Studio 2013 z EntityFramework 6 i MVC 5.

Największą różnicą między nimi jest to, że Linq2SQL ma zdolność do przeprowadzania konwersji wewnątrz samego zapytania SELECT, podczas gdy LINQ2Entities nie jest tak wyrozumiały i musi mieć właściwą konwersję przed wykonaniem zapytania LINQ. Dlatego otrzymuję błąd:Określona metoda „System.Decimal ConvertToDecimal (Byte)” w typie „BillYeagerDB.EdmxExtensionMethods” nie może zostać przetłumaczona na wyrażenie magazynu LINQ na Entities.

Po przeprowadzeniu wielu badań, szczególnie na temat stackoveflow z tym pytaniem, odkryłem link (LINQ to Entities nie rozpoznaje metody „Double Parse (System.String)”, a tej metody nie można przetłumaczyć na wyrażenie magazynu) Mam nadzieję, że to zadziała. Jestem pewien, że przykład autora daje prace, ale pracował z ObjectContext i pracuję z DbContext.

Jestem również pewien, że to zadziała dla mnie, ale myślę, że po prostu projektuję metodę rozszerzenia niepoprawnie (co daje mi powyższy błąd). Zauważ, że ten konkretny problem dotyczyAvgRating zmienna w zapytaniu Linq. Gdy uda mi się to uruchomić, mogę wykonać ten sam rodzaj naprawy dla wszystkich innych konwersji. Zauważ, żeAvgRating jest zdefiniowany jako typ dziesiętny ia.Rating.RatingValue jest zdefiniowany jako typ Byte.

Gdyby ktoś mógł mnie wyprostować, byłbym bardzo wdzięczny.

Oto mój kod. Próbuję użyć następującego zapytania, które, jak wiem, nie będzie działać (jak wspomniano wcześniej) z powodu problemu z konwersją.

Oryginalne zapytanie LINQ:

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;
            }
        }
    }
}

Aktualizacja, którą musiałem zrobić w moim pliku EDMX

<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>

Metoda rozszerzenia C #, która jest klasą w katalogu głównym mojego projektu - nie wewnątrz mojego 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);
        }
    }
}

Zaktualizowane zapytanie Linq - nie zwracaj uwagi na błędy kompilacji czasu projektowania i kompilowanie projektu z powodzeniem

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;
            }
        }
    }
}

questionAnswers(2)

yourAnswerToTheQuestion