MVCCrud Using LinqToEntities

本文关键字:LinqToEntities Using MVCCrud | 更新日期: 2023-09-27 18:34:38

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

问题是MVCCrud使用LingToSQL,而我想使用LinqToEntities。转换到 LinqToEntities 后,除了一个地方之外,我几乎可以正常工作。

在下面的代码中,i = typeof(TModel(。GetProperty(primaryKey(。GetValue(p, null(, 单元格 = getCells(p(它给出了一个 Linq to Entities 无法识别 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();
    }

MVCCrud Using LinqToEntities

ToList()而不是

AsQueryable()执行此操作:

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

不能"在"linq 查询中执行任何外部方法。

你可以说这在 Linq2Sql 中工作,那么你应该知道当你调用任何外部方法"像ToString()"时,Linq2Sql 将从数据库中获取所有数据,然后在内存中处理你的查询,如果你有很多记录,这可能是一个严重的伤害。

有关更多信息,请查看此内容