所以我有两个问题都与实体框架和 LINQ 有关。我正在为一群朋友进行网络应用程序的概念验证。我正在使用带有虚拟数据的模拟数据库,这样我就可以测试我的 API。
问题 1:我正在尝试使用模拟数据库中的数据随机填充对象“Award”的列表。
foreach (var i in Enumerable.Range(1,50))
{
db.Troopers.Add(new Trooper
{
Id = i,
Name = $"Trooper {i}",
Callsign = $"TK-{i}",
Awards = db.Awards.Where(award => i % award.Id == 0).ToList()
};
}
db.SaveChanges();
问题是奖项始终是一个空列表。我已经单独测试了
db.Awards.Where(award => i % award.Id == 0).ToList()
部分,它返回值。我不明白为什么列表总是空的。我做错了什么?
问题 2:我希望能够通过传入要排序的属性名称来对数据库中的结果进行排序。
public ICollection<Trooper> GetAllTroopersOrdered(string property)
{
return db.Troopers.OrderBy(trooper => trooper.GetType().GetProperty(property)).ToList();
}
这给了我错误
System.InvalidOperationException:“无法翻译 LINQ 表达式 'DbSet().OrderBy(s => s.GetType().GetProperty(__order_0))”。以可翻译的形式重写查询,或者通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用来显式切换到客户端计算。 我查看了 Microsoft 文档中的客户端与服务器评估,整个事情都在我的头脑中进行。有什么更好的方法来获得我想要的结果?
预先感谢您的帮助。
看起来该问题可能与实体框架如何跟踪更改以及处理 Trooper 和 Award 实体之间的关系有关。当您调用
db.Awards.Where(award => i % award.Id == 0).ToList()
时,您正在检索奖励列表,但实体框架可能不会自动跟踪 Trooper 与检索到的奖励之间的关系。
为了确保实体框架正确建立并跟踪关系,您可以尝试将奖项附加到上下文,然后再将其分配给 Trooper 对象的 Awards 属性。
即
foreach (var i in Enumerable.Range(1, 50))
{
var trooper = new Trooper
{
Id = i,
Name = $"Trooper {i}",
Callsign = $"TK-{i}"
};
var awards = db.Awards.Where(award => i % award.Id == 0).ToList();
// Attach the awards to the context
foreach (var award in awards)
{
db.Awards.Attach(award);
}
trooper.Awards = awards;
db.Troopers.Add(trooper);
}
db.SaveChanges();
对于您的第二个问题,请再问一个。这是一个完全不同的问题。