【问题标题】:How can i have a linq result set returned as a custom type如何将 linq 结果集作为自定义类型返回
【发布时间】:2012-04-10 03:47:58
【问题描述】:
public class LearnerInfo
{
    public string Id { get; set; }
    public string Name { get; set; }


    public LearnerInfo(string id, string name)
    {
        this.Id = id;
        this.Name = name;
    }
}


public class LearnerCourse
{
    public string Id { get; set; }
    public string ExpiredCount { get; set; }
    public string Soonduecount { get; set; }
    public string Currentmonthcount { get; set; }
    public string Currentmonthplus1count { get; set; }
    public string Currentmonthplus2count { get; set; }
    public string Currentmonthplus3count { get; set; }
    public string Currentmonthplus4count { get; set; }
    public string Currentmonthplus5count { get; set; }
    public string Subtotal { get; set; }


    public LearnerCourse(string id, string exp, string soonDue, string current, string plus1, string plus2,
        string plus3, string plus4, string plus5)
    {
        this.Id = id;
        this.ExpiredCount = exp;
        this.Soonduecount = soonDue;
        this.Currentmonthcount = current;
        this.Currentmonthplus1count = plus1;
        this.Currentmonthplus2count = plus2;
        this.Currentmonthplus3count = plus3;
        this.Currentmonthplus4count = plus4;
        this.Currentmonthplus5count = plus5;
    }


    public LearnerCourse()
    { }
}

public class InfoList : IEnumerable<CombinedInfo>
{

    private List<CombinedInfo> _infoList = new List<CombinedInfo>();

    public InfoList()
    {
        _infoList = new List<CombinedInfo>();
    }


    public void Add(CombinedInfo i)
    {
        _infoList.Add(i);
    }


    public IEnumerator<CombinedInfo> GetEnumerator()
    {
        return _infoList.GetEnumerator();
    }


    //IEnumerable Members
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        throw new NotImplementedException();
    }
}


public class CombinedInfo
{
    public string Id { get; set; }
    public string ExpiredCount { get; set; }
    public string Soonduecount { get; set; }
    public string Currentmonthcount { get; set; }
    public string Currentmonthplus1count { get; set; }
    public string Currentmonthplus2count { get; set; }
    public string Currentmonthplus3count { get; set; }
    public string Currentmonthplus4count { get; set; }
    public string Currentmonthplus5count { get; set; }
    public string Name { get; set; }
}


    static void Main(string[] args)
    {
        LearnerCourse lc1 = new LearnerCourse("777", "1", "1", "0", "1", "0", "0", "0", "0");
        LearnerCourse lc2 = new LearnerCourse("589", "1", "0", "0", "0", "0", "0", "0", "0");

        LearnerInfo li1 = new LearnerInfo("777", "moe");
        LearnerInfo li2 = new LearnerInfo("589", "larry");

        LearnerCourse[] lCourses = new LearnerCourse[2];
        lCourses[0] = lc1;
        lCourses[1] = lc2;

        LearnerInfo[] linfos = new LearnerInfo[2];
        linfos[0] = li1;
        linfos[1] = li2;


        //test linq join for object array
        var myJoin = (from c in lCourses
                     join i in linfos on c.Id equals i.Id
                    select new {
                         c.ExpiredCount, 
                         c.Soonduecount,
                         c.Currentmonthcount,
                         c.Currentmonthplus1count,
                         c.Currentmonthplus2count,
                         c.Currentmonthplus3count,
                         c.Currentmonthplus4count,
                         c.Currentmonthplus5count,
                         c.Subtotal,
                         i.Id,
                         i.Name
                     });


        foreach (CombinedInfo o in l)
        {
            //loop through and can add to list of type CombinedInfo
        }
}

我没有通过 foreach 循环,而是在尝试从我的 linq 查询中获取结果集以仅返回一个列表时遇到问题。

建议?

【问题讨论】:

    标签: linq c#-3.0 custom-type


    【解决方案1】:

    两件事:

    a) 项目到自定义类,而不是匿名类型。在您的情况下,您已经定义了 CombinedInfo - 使用它。

    b) 使用ToList() 强制执行并将结果转换为List&lt;T&gt;

    var list = (from c in lCourses
                 join i in linfos on c.Id equals i.Id
                select new  CombinedInfo() {
                     ExpiredCount = c.ExpiredCount, 
                     Soonduecount = c.Soonduecount,
                     Currentmonthcount = c.Currentmonthcount,
                     Currentmonthplus1count = c.Currentmonthplus1count,
                     Currentmonthplus2count = c.Currentmonthplus2count,
                     Currentmonthplus3count = c.Currentmonthplus3count,
                     Currentmonthplus4count = c.Currentmonthplus4count,
                     Currentmonthplus5count = c.Currentmonthplus5count,
                     Subtotal = c.Subtotal,
                     Id  = i.Id,
                     Name = i.Name
                 }).ToList();
    

    【讨论】:

    • 完美,我尝试了各种各样的东西,当我尝试这个解决方案时,我遗漏了一个东西,PropertyName = from 和你拥有的 select new。谢谢你的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多