LINQ to Entities StringConvert (double) 'не может быть переведен для преобразования int в строку - PullRequest
4 голосов
/ 24 апреля 2011

Задача

Необходимо преобразовать int в строку, используя EF4 + SQL CE4. Рекомендуемый вариант использования SqlFunctions.StringConvert (double) по-прежнему дает мне ошибки.

Вариант 1 (оригинал). Это дает мне ошибку:

public static IEnumerable<SelectListItem> xxGetCustomerList()
    {
        using (DatabaseEntities db = new DatabaseEntities())
        {
            var list = from l in db.Customers
                       orderby l.CompanyName
                       select new SelectListItem { Value = l.CustomerID.ToString(), Text = l.CompanyName };
            return list.ToList();
        }
    }

Вариант 2 (наиболее рекомендуемый). Затем, как подсказывают многие посты, я использовал функцию SqlFunctions.StringConvert () из библиотеки System.Data.Objects.SqlClient:

public static IEnumerable<SelectListItem> GetCustomerList()
    {
        using (DatabaseEntities db = new DatabaseEntities())
        {
            var list = from l in db.Customers
                       orderby l.CompanyName
                       select new SelectListItem { Value = SqlFunctions.StringConvert((double)l.CustomerID), Text = l.CompanyName };
            return list.ToList();
        }
    }

Который теперь показывает ниже ошибку:

The specified method 'System.String StringConvert(System.Nullable`1[System.Double])' on the type 'System.Data.Objects.SqlClient.SqlFunctions' cannot be translated into a LINQ to Entities store expression.

Вариант 3 (для очень специфического случая). Затем в другом посте показано умное решение с использованием словаря, которое наконец работает:

public static IEnumerable<SelectListItem> xGetCustomerList()
    {
        using (DatabaseEntities db = new DatabaseEntities())
        {
            var customers = db.Customers.ToDictionary(k => k.CustomerID, k => k.CompanyName);
            var list = from l in customers
                       orderby l.Value
                       select new SelectListItem { Value = l.Key.ToString(), Text = l.Value };
            return list.ToList();
        }
    }

Но работают только для простых парных значений (ключ, значение). Может кто-нибудь помочь мне с другим решением или что я делаю не так с вариантом 2?

И я надеюсь, что Microsoft скоро сделает EF прямо перед тем, как подтолкнуть нас к переходу с L2S, который уже стабилен и гораздо более зрел. Я на самом деле использую EF4 только потому, что хочу использовать SQL CE, иначе я останусь с L2S.

Ответы [ 2 ]

5 голосов
/ 24 апреля 2011

EF не зависит от базы данных на верхних уровнях, но часть, касающаяся преобразования запроса linq в SQL, всегда зависит от базы данных, а SqlFunctions зависит от поставщика SQL Server, но вы используете поставщик SQL Server CE, который не может переводить функции от SqlFunctions класс.

Btw. Третий вариант также не является решением, поскольку он выберет всю таблицу клиентов в память и после этого будет использовать linq-to-objects. Вы должны использовать это:

public static IEnumerable<SelectListItem> xxGetCustomerList()
{
    using (DatabaseEntities db = new DatabaseEntities())
    {
        // Linq to entities query
        var query = from l in db.Customers
                    orderby l.CompanyName
                    select new { l.CustomerID, l.CompanyName };

        // Result of linq to entities transformed by linq to objects
        return query.AsEnumerable()
                    .Select(x => new SelectListItem
                        {
                           Value = x.CustomerID.ToString(),
                           Test = x.CompanyName  
                        }).ToList();
    }
}
0 голосов
/ 05 мая 2011

Вот упрощенная версия, которую я сейчас использую (специально для SQL CE):

    public static IEnumerable<SelectListItem> GetBlogCategoryList()
    {
        using (SiteDataContext db = new SiteDataContext())
        {
            var list = from l in db.BlogCategories.AsEnumerable()
                       orderby l.CategoryName
                       select new SelectListItem { Value = l.CategoryID.ToString(), Text = l.CategoryName };

            return list.ToList();
        }
    }

Обратите внимание на db.BlogCategories.AsEnumerable () part

...