在创建动态页面时,我尝试访问两个由foreach循环修改的变量。即使我在外部声明变量,该变量也会在循环后变为未分配。
我知道我应该找到一种建立 sql联接的方法,但是,每当我尝试在循环之前访问变量时,都会一直发生此问题。我搜索了一种方法来阻止垃圾收集器完全删除该变量,但是我需要一种更简洁的方法来实现此目的。
@foreach (var item in db.Horraire)
{
String Employe;
String color;
foreach (var search in db.Employé)
{
if (search.id == item.EmployeID) { Employe = search.naming; break; }
}
foreach (var search in db.Tâche)
{
if (search.id == item.EmployeID) { color = search.coloring; break; }
}
//Turning worked hour into size of occupied red square on a calendar, it's working properly
TimeSpan substract = item.fin.Subtract(item.début);
float phours = substract.Hours * 70; phours = phours + substract.Minutes * (60/70);
String pheight = ""+phours+"px";
float thours = item.début.Subtract(new DateTime()).Hours + item.début.Subtract(new DateTime()).Minutes/60 - 8; thours = thours * 70 + 110;
String theight = ""+thours+"px";
int lday = item.Jour * 200 + 200;
String ljour = "" + lday + "px";
<div class="redsquare" style="
position: absolute; width:200px; height:@pheight;
top:@theight;
left:@ljour;
font-size: 0.8em;
text-align: right;
color: @color;"> //missing local variable
@Employe //missing local variable
</div>
}
两个变量都将变为错误“使用未分配的局部变量” ,而不仅仅是将变量注入到html中。如何修复联合,变量的作用域或垃圾回收?
答案 0 :(得分:0)
感谢我根本不知道的LINQ语言的答案和方向。这是避免示波器混乱的新行
r = requests.get(projectsExportURL, auth=(username, password), verify=False,stream=True)
r.raw.decode_content = True
#add snapshot date column
df = pd.read_excel(r.raw,sheet_name='Tasks',Headers=0)
答案 1 :(得分:0)
这与“垃圾回收器完全删除变量”无关,也与变量的范围无关。
虽然可以肯定foreach()
肯定会分配变量,但C#编译器却没有。当然是这样。
因此,您需要为它们分配合理的默认值:
String Employe = "";
String color = "";
但是您的代码还有更多问题。您的答案中的解决方案:
@db.Tache.FirstOrDefault(x => x.id == item.EmployeID).coloring;
@db.Employe.FirstOrDefault(x => x.id == item.EmployeID).naming;
当NullReferenceException
返回FirstOrDefault()
时,将抛出null
。因此,您必须添加一个空检查,或直接调用First()
。反之,当数据库中没有匹配的记录时,将抛出该异常。
解决方案的确是在查询时联接表:
@foreach (var item in db.Horraire.Include(h => h.Employé).Include(h => h.Tâche))
{
// ...
<div style="color: @item.Tâche.coloring">@item.Employé.naming</div>
}
但是您实际上不应该在视图中运行查询,您应该在控制器中执行此操作并填充视图模型。