我正在做一个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的每条记录,并获取在查询中选择的信息,例如MatriculeEmail,如下所示:

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;
}





您仍然可以像以前一样使用objectdynamic,并且仅访问属性,但是由于智能变量不知道具体的类型,因此您不会具有显示属性和选项的智能提示。

关于c# - 如何存储Linq查询并在以后使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46252432/

10-12 13:05