0

MVCCrud というサンプル アプリケーションがあります。この例は非常に優れており、現在取り組んでいるプロジェクトのフレームワークとして使用したいと考えています。

問題は、MVCCrud が LingToSQL を使用していて、LinqToEntities を使用したいということです。LinqToEntities に変換すると、1 か所を除いてほとんどすべてが正しく機能するようになりました。

次のコードの行 i = typeof(TModel).GetProperty(primaryKey).GetValue(p, null), cell = getCells(p) では、Linq をエンティティに与えますが、GetValue は認識されません。

次のコードのリファクタリングを手伝ってくれる人はいますか?

            items = items.OrderBy(string.Format("{0} {1}", sidx, sord)).Skip(pageIndex * pageSize).Take(pageSize).AsQueryable();

            // Generate JSON
            var jsonData =
                new
                    {
                        total = totalPages,
                        page,
                        records = totalRecords,
                        rows = items.Select(
                            p => new
                                {
                                    // id column from repository
                                    i = typeof(TModel).GetProperty(primaryKey).GetValue(p, null),
                                    cell = getCells(p)
                                }).ToArray()
                    };
            return Json(jsonData);

getCell メソッドは次のとおりです。

    private string[] getCells(TModel p)
    {
        List<string> result = new List<string>();

        string a = actionCell(p);
        if (a != null)
        {
            result.Add(a);
        }

        foreach (string column in data_rows.Select(r => r.value))
        {
            try
            {
                // hack for tblcategory.name
                string[] parts = column.Split('.');

                // Set first part
                PropertyInfo c = typeof(TModel).GetProperty(parts[0]);
                object tmp = c.GetValue(p, null);

                // loop through if there is more than one depth to the . eg tblCategory.name
                for (int j = 1; j < parts.Length; j++)
                {
                    c = tmp.GetType().GetProperty(parts[j]);
                    tmp = c.GetValue(tmp, null);
                }

                if (tmp.GetType() == typeof(DateTime))
                {
                    result.Add(((DateTime)tmp).ToString(dateTimeFormat));
                }
                else if (tmp.GetType() == typeof(float))
                {
                    result.Add(((float)tmp).ToString(decimalFormat));
                }
                else if (tmp.GetType() == typeof(double))
                {
                    result.Add(((double)tmp).ToString(decimalFormat));
                }
                else if (tmp.GetType() == typeof(decimal))
                {
                    result.Add(((decimal)tmp).ToString(decimalFormat));
                }
                else
                {
                    result.Add(tmp.ToString());
                }
            }
            catch (Exception)
            {
                result.Add(string.Empty);
            }
        }

        return result.ToArray();
    }
4

1 に答える 1

0

ToList()代わりにこれを行いAsQueryable()ます:

items = items.OrderBy(string.Format("{0} {1}", sidx, sord)).Skip(pageIndex * pageSize).Take(pageSize).ToList();

linqクエリの「内」で外部メソッドを実行することはできません。

そして、それが Linq2Sql で機能していたと言うかもしれませんが、「Like ToString()」のような外部メソッドを呼び出すと、Linq2Sql はデータベースからすべてのデータを取得し、クエリをメモリ内で処理することを知っておく必要があります。

詳細については、これを見てください

于 2012-05-20T10:40:58.260 に答える