我是MVC和数据库的新手,但我非常肯定我从数据库中获取数据的方式非常低效。
public class PokemonViewController : Controller
{
private PokemonDayCareDBEntities1 db = new PokemonDayCareDBEntities1();
[Authorize]
public ActionResult Pokemon(int id)
{
var pkmn = db.PlayerPkmns.ToList();
PlayerPkmn thispkmn = null;
//get pokemon from database where id = id
foreach (var item in pkmn)
{
if (item.Id == id)
{
thispkmn = item;
}
}
....
我拥有驻留在PlayerPkmns表中的Pokemon的唯一ID,但我循环遍历整个表以查找匹配的ID。
根据表的大小,执行所需的时间会增加。
我很肯定有更好的方式 - 有人知道是否有一个(也就是如何使用它的语法)
谢谢!
答案 0 :(得分:7)
Log.d(TAG, debugMessage)
是你的朋友。
改变这个:
SingleOrDefault
到
var pkmn = db.PlayerPkmns.ToList();
这将(大致)转换为以下SQL
var pkmn = db.PlayerPkmns.SingleOrDefault(x => x.Id == id);
答案 1 :(得分:3)
检索实体的最有效方法是使用.Find() 其中primaryKey是您传入的ID。
var PlayerPkmn= db.PlayerPkmns.Find(primaryKey)
答案 2 :(得分:1)
当您使用Linq to Entities时,您应该能够将Where()
与FirstOrDefault()
结合使用:
var pkmn = db.PlayerPkmns.Where(x=>x.Id == id).FirstOrDefault();
你现在正在做的事情将导致所有记录被带入记忆中,这不是你想要的,而且它的性能将比你现在的方式高很多,就像你的方式一样这样做,它会将所有记录加载到内存中。
答案 3 :(得分:-1)
我认为db.PlayerPkmns.SingleOrDefault(x => x.Id == id)
是实体框架数据上下文。
在这种情况下,如果要处理数据库中不存在实体的情况,可以使用db.PlayerPkmns.Single(x => x.Id == id)
或 //Change the name id in the xml file
Button microsoftButton = (Button) findViewById(R.id.microsoftButton);
TextView scoreTextView = (TextView) findViewById(R.id.scoreTextView);
microsoftButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(),"Wrong!", Toast.LENGTH_SHORT).show();
// This was declared above so now you can use it. You can only set it to a String not to an Integer.
scoreTextView.setText("0");
}
});
cordova platform update ios
如果您确定严格中只有一个元素DB(如果实体不存在则抛出)。