Entity Framework:查询与 foreach
Entity Framework : query vs foreach
是否可以使用 foreach
进行这样的简单查询?或者我应该总是使用查询的东西吗?
public static Staff GetTeacher(Context context, int staffId)
{
foreach (Staff staff in context.Staff)
{
if(staff.StaffID == staffId)
{
return staff;
}
}
return null;
}
public static object GetTeacher(Context context, int staffId)
{
var staff = from teacher in context.Staff
where teacher.StaffID == staffId
select new
{
Id = teacher.StaffID,
Teacher = teacher.FirstName + " " + teacher.LastName
};
return staff;
}
foreach
将遍历数据库 table 中的每条记录,直到找到匹配项,这意味着它最终可能会将每条记录都拉入内存。那可能会非常慢。
Linq 查询将构造一个 SQL 语句,仅提取相关记录。
所以第二种选择要好得多。但是,看起来您试图通过使函数 return 成为一个对象来解决您的第二个查询给出可枚举的员工对象列表的事实。相反,你可以让整个事情看起来更好,像这样:
public static Staff GetTeacher(Context context, int staffId)
{
return context.Staff.Single(s => s.StaffID == staffId);
}
这将是最有效的方法。如果数据库中没有匹配的 staffId
就会抛出异常。这对你来说可能是件好事。如果不是,请将其更改为使用 SingleOrDefault
而不是 Single
。
旁注:我担心方法 static
。这表明 DbContext 可能被共享或 long-lived 这都是坏事。
是否可以使用 foreach
进行这样的简单查询?或者我应该总是使用查询的东西吗?
public static Staff GetTeacher(Context context, int staffId)
{
foreach (Staff staff in context.Staff)
{
if(staff.StaffID == staffId)
{
return staff;
}
}
return null;
}
public static object GetTeacher(Context context, int staffId)
{
var staff = from teacher in context.Staff
where teacher.StaffID == staffId
select new
{
Id = teacher.StaffID,
Teacher = teacher.FirstName + " " + teacher.LastName
};
return staff;
}
foreach
将遍历数据库 table 中的每条记录,直到找到匹配项,这意味着它最终可能会将每条记录都拉入内存。那可能会非常慢。
Linq 查询将构造一个 SQL 语句,仅提取相关记录。
所以第二种选择要好得多。但是,看起来您试图通过使函数 return 成为一个对象来解决您的第二个查询给出可枚举的员工对象列表的事实。相反,你可以让整个事情看起来更好,像这样:
public static Staff GetTeacher(Context context, int staffId)
{
return context.Staff.Single(s => s.StaffID == staffId);
}
这将是最有效的方法。如果数据库中没有匹配的 staffId
就会抛出异常。这对你来说可能是件好事。如果不是,请将其更改为使用 SingleOrDefault
而不是 Single
。
旁注:我担心方法 static
。这表明 DbContext 可能被共享或 long-lived 这都是坏事。