我正在做一个wpf应用程序,我有一个问题,我想问你。
我正在查询窗口级别的数据库,并将查询结果传递给我的对象中的方法,如下所示:
窗口级代码:
payrollEmailManager.SetListOfSalariesToEmailTo(
from Record in SqlInfo.SqlTable.T_SALs
where Record.EtatPaie == 3
select new {
Matricule = Record.MatriculeSalarie,
Nom = Record.Nom,
Prenom = Record.Prenom,
Email = Record.EMail });
这是我的方法定义:
public void SetListOfSalariesToEmailTo(object _ListOfSalaryToRecieveMail)
{
ListOfSalary = _ListOfSalaryToRecieveMail;
}
ListOfSalary
的类型object
。
现在这是我的问题,我有另一种方法,我希望通过listofsalary
的每条记录来获取我在查询中选择的信息,例如Matricule
或Email
,像这样的东西:
public void SendEmail()
{
foreach(var Salary in (dynamic)ListOfSalary)
{
Mail.To.Add(Salary.????
}
}
我无法引用Nom
列或Email
列的任何建议吗?
答案 0 :(得分:6)
如果您考虑以下查询:
var query = from Record in SqlInfo.SqlTable.T_SALs
where Record.EtatPaie == 3
select new {
Matricule = Record.MatriculeSalarie,
Nom = Record.Nom,
Prenom = Record.Prenom,
Email = Record.EMail
};
运行此行后,查询尚未执行到数据库。只有当您实现它时(使用ToList()
/ ToArray()
/ FirstOrDefault
等函数),它才会在数据库中执行并返回信息。
因此,如果你只是执行SomeFunction(query);
,它就不会执行查询,你可以存储它以供以后执行。
但是您需要稍微更改一下代码:
该函数不应该是IQueryable<T>
public void SetListOfSalariesToEmailTo(IQueryable<T> query)
由于您希望存储查询,因此稍后您需要知道每个项目的类型。为此,请勿在select中使用匿名对象(new { }
)。使用自定义对象或使用名为tuples的c#7.0,然后该函数将如下所示:
var query = from Record in SqlInfo.SqlTable.T_SALs
where Record.EtatPaie == 3
select new SomeType {
Matricule = Record.MatriculeSalarie,
Nom = Record.Nom,
Prenom = Record.Prenom,
Email = Record.EMail
};
public void SetListOfSalariesToEmailTo(IQueryable<SomeType> query)
{
ListOfSalary = query;
}
您仍然可以像使用object
和dynamic
一样使用,只需访问属性,但您不会让intellisense显示属性和选项,因为它不知道具体类型