我正在做一个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
列中引用任何建议? 最佳答案
如果考虑以下查询:
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)
当您要存储查询时,您以后需要知道每个项目的类型。为此,请不要在选择中使用匿名对象(
new { }
)。改用自定义对象或使用名为元组的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
,并且仅访问属性,但是由于智能变量不知道具体的类型,因此您不会具有显示属性和选项的智能提示。关于c# - 如何存储Linq查询并在以后使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46252432/