Не может быть переведено в выражение хранилища LINQ to Entities

Я относительно новичок в LINQ to Entities, но часто использую LINQ для Sql.

Я использую Visual Studio 2013 с EntityFramework 6 и MVC 5.

Самое большое различие между ними заключается в том, что Linq2SQL имеет возможность выполнять преобразования внутри самого запроса SELECT, тогда как LINQ2Entities не так простителен и должен иметь правильное преобразование на месте перед выполнением запроса LINQ. Поэтому я получаю ошибку:Указанный метод «System.Decimal ConvertToDecimal (Byte)» типа «BillYeagerDB.EdmxExtensionMethods» не может быть преобразован в выражение хранилища LINQ to Entities.

После долгих исследований, особенно в отношении stackoveflow с этим вопросом, я обнаружил ссылку (LINQ to Entities не распознает метод метода Double Parse (System.String), и этот метод нельзя преобразовать в выражение хранилища) это, надеюсь, будет работать. Я уверен, что пример, который дает автор, работает, но он работал с ObjectContext, а я работаю с DbContext.

Я также уверен, что это будет работать для меня, но я думаю, что я просто неправильно проектирую метод расширения (который дает мне вышеуказанную ошибку). Обратите внимание, что эта конкретная проблема связана сAvgRating переменная в запросе Linq. Как только я смогу заставить это работать, я могу сделать то же самое исправление для любых других преобразований. Обратите внимание, чтоAvgRating определяется как тип Decimal иa.Rating.RatingValue определяется как тип Byte.

Если кто-то сможет мне помочь, я был бы очень признателен.

Вот мой код Я пытаюсь использовать следующий запрос, который, как я знаю, не будет работать (как упоминалось ранее) из-за проблемы с конвертацией.

Оригинальный запрос 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;
            }
        }
    }
}

Обновление мне нужно сделать, чтобы мой файл 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>

Метод расширения C #, который является классом в корне моего проекта, а не внутри моего 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);
        }
    }
}

Обновлен запрос 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 => EdmxExtensionMethods.ConvertToDecimal(a.Rating.RatingValue)),
                            NbrOfPeopleRating = s.Distinct().Count(c => Convert.ToBoolean(c.RatingId)),
                            Id = s.Key.Id
                        }).ToListAsync();

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

Ответы на вопрос(2)

Ваш ответ на вопрос