首页 > 解决方案 > 在 C# 中使用 LINQ 将项目添加到 IList?

问题描述

这是我的模型 SigningAbsenceType

public class SigningAbsenceType
{
    public float YearAbsence { get; set; }
    public float SickAbsence { get; set; }
}

我想将来自 LINQ 的新项目添加到模型中的每个项目

var getType = oracleConn.SelectAbsenceType(EmployeeID).Select(t => t.Type).Distinct().ToArray();
IList<SigningAbsenceType> result = new List<SigningAbsenceType>();

for (int i = 0; i < getType.Length; i++)
{
    string t = getType[i];
    switch (getType[i])
    {
        case "A":
            var YearAbsence = oracleConn.SelectAbsenceType(EmployeeID)
                .Where(k => k.Type == "A")
                .GroupBy(g => g.Type)
                .Select(h => new
                {
                    TotalHour = h.Sum(s => s.TotalHour)
                });
            break;
        case "S":
            var SickAbsence = oracleConn.SelectAbsenceType(EmployeeID)
                .Where(k => k.Type == "S")
                .GroupBy(g => g.Type)
                .Select(h => new
                {
                    TotalHour = h.Sum(s => s.TotalHour)
                });
            break;
    }
}
return result;

如何YearAbsence在 LINQ 中插入IList<SigningAbsenceType> result

.ToList()在 LINQ 中尝试过,然后添加到结果中result.Add(new SigningAbsenceType { YearAbsence = YearAbsence });

但是错误是Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<<anonymous type: float TotalHour>>' to 'float' 请帮助,我花了一整天的时间来解决这个问题,但没有结果。非常感谢

编辑:我已经解决了

var getType = oracleConn.SelectAbsenceType(EmployeeID).Select(t => t.Type).Distinct().ToArray();
List<SigningAbsenceType> result = new List<SigningAbsenceType>();
float yA = 0;
float sickAbsence = 0; 
float harmfulAbsence = 0;
float unauthorizedAbsence = 0;
float personalAbsence = 0;
float compensatoryAbsence = 0;

for (int i = 0; i < getType.Length; i++)
{
    string t = getType[i];
    switch (getType[i])
    {
        case "A":
            yA = oracleConn.SelectAbsenceType(EmployeeID)
                .Where(k => k.Type == "A").Sum(s => (s.TotalHour)/8);
            break;
        case "S":
            sickAbsence = oracleConn.SelectAbsenceType(EmployeeID)
                .Where(k => k.Type == "S").Sum(s => (s.TotalHour) / 8);
            break;
        case "HA":
            harmfulAbsence = oracleConn.SelectAbsenceType(EmployeeID)
                .Where(k => k.Type == "HA").Sum(s => (s.TotalHour) / 8);
            break;
        case "N":
            unauthorizedAbsence = oracleConn.SelectAbsenceType(EmployeeID)
                .Where(k => k.Type == "N").Sum(s => (s.TotalHour) / 8);
            break;
        case "P":
            personalAbsence = oracleConn.SelectAbsenceType(EmployeeID)
                .Where(k => k.Type == "P").Sum(s => (s.TotalHour) / 8);
            break;
        case "H":
            compensatoryAbsence = oracleConn.SelectAbsenceType(EmployeeID)
                .Where(k => k.Type == "H").Sum(s => (s.TotalHour) / 8);
            break;
        default:
            break;
    }
}
result.Add(new SigningAbsenceType
{
    YearAbsence = yA,
    SickAbsence = sickAbsence,
    HarmfulAbsence = harmfulAbsence,
    CompensatoryAbsence = compensatoryAbsence,
    PersonalAbsence = personalAbsence,
    UnauthorizedAbsence = personalAbsence
});
return result;

标签: c#asp.net-mvclinq

解决方案


注意:在 Mrinal Kamboj 评论后更新

因此,根据getType[i]您创建匿名类型对象的结果,aYearAbsence或 a SickAbsence,并且您希望将此匿名类型对象添加到 a IList<SigningAbsenceType>

唉,你只能将类的对象添加SigningaAbsendType到你的列表中,毕竟,你将它定义为一个SigningaAbsendType.

最简单的方法是将YearAbsenceand声明SickAbsence为 class 的对象SigningaAbsendType

switch (getType[i])
{
    case "A":
        IEnumerable<SigningAbsenceType> fetchedSingingAbsences = oracleConn
            .SelectAbsenceType(EmployeeID)
            .Where(k => k.Type == "A")
            .GroupBy(g => g.Type)
            .Select(h => new SigningAbsenceType
            {
                YearAbsence = h.Sum(s => s.TotalHour),
                SickAbsence = 0.0,
            })
            .ToList();

            // now you can add the fetched data to the list!
            foreach(SingingAbsence fetchedSigningAbsence in fetchedSingingAbsences)
            {
                result.AddRange(fetchedSigningAbsence);
            }
        break;

    case "S": // something similar

另一种非常相似的方法是:

switch (getType[i])
{
    case "A":
        IEnumerable<float> fetchedYearAbsences = oracleConn
            .SelectAbsenceType(EmployeeID)
            .Where(k => k.Type == "A")
            .GroupBy(g => g.Type)
            .Select(h => h.Sum(s => s.TotalHour));

        // add to the list:
        foreach (float fetchedYearAbsence in fetchedYearAbsences)
        {
             result.Add(new SigningAbsenceType
            {
                YearAbsence = fetchedYearAbsence,
                SickAbsence = 0.0f;
            });
        }
        break;

推荐阅读