4

問題

EF4 +SQLCE4を使用してintを文字列に変換する必要があります。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(最も推奨)。次に、多くの投稿が示唆しているように、ライブラリSystem.Data.Objects.SqlClientのSqlFunctions.StringConvert()関数を使用しました。

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からの移行を推進することを願っています。SQL CEを使用したいという理由だけで、実際にEF4を使用しています。それ以外の場合は、L2Sを使用します。

4

2 に答える 2

5

EFは上位層でデータベースに依存しませんが、linqクエリからSQLへの変換を処理する部分は常にデータベースSqlFunctionsに依存し、SQL Serverプロバイダーに依存しますが、SqlFunctionsクラスから関数を変換できないSQLServerCEプロバイダーを使用しています。

ところで。3番目のオプションも、顧客テーブル全体をメモリに選択し、その後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();
    }
}
于 2011-04-24T15:51:53.887 に答える
-1

これが私が現在使用している簡略化されたバージョンです(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()の部分に注意してください

于 2011-05-05T07:20:08.260 に答える