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();
}
ToList()
而不是AsQueryable()
执行此操作:
items = items.OrderBy(string.Format("{0} {1}", sidx, sord)).Skip(pageIndex * pageSize).Take(pageSize).ToList();
不能"在"linq 查询中执行任何外部方法。
你可以说这在 Linq2Sql 中工作,那么你应该知道当你调用任何外部方法"像ToString()
"时,Linq2Sql 将从数据库中获取所有数据,然后在内存中处理你的查询,如果你有很多记录,这可能是一个严重的伤害。
有关更多信息,请查看此内容