0

有一个名为 MVCCrud 的示例应用程序。这个例子非常好,我想将它用作我正在从事的项目的框架。

问题是 MVCCrud 使用 LingToSQL,我想使用 LinqToEntities。一旦我转换为 LinqToEntities,除了一个地方之外,我几乎所有的东西都能正常工作。

在 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 回答