5

我正在尝试合并以下两个列表:

var quartEst = Quarterly_estimates
.OrderByDescending (q => q.Yyyy)
.ThenByDescending (q => q.Quarter)
.Where (q => 
    q.Ticker.Equals("IBM")
    &&
    q.Eps != null
    )
.Select (q => new {
    ticker = q.Ticker,
    Quarter = q.Quarter,
    Year = q.Yyyy,
    Eps = q.Eps})
.AsEnumerable()
.Where (q => Convert.ToInt32(string.Format("{0}{1}", q.Year, q.Quarter)) > Convert.ToInt32(finInfo) );

var quartAct = Quarterlies
.OrderByDescending (q => q.Yyyy)
.ThenByDescending (q => q.Quarter)
.Where (q => 
    q.Ticker.Equals("IBM")
    &&
    Convert.ToInt16(q.Yyyy) >= DateTime.Now.Year - 3
    )
.Select (q => new {
    Tick = q.Ticker,
    Quarter = q.Quarter,
    Year = q.Yyyy,
    Eps = q.Eps_adj})
.AsEnumerable()
.Where (q => Convert.ToInt32(string.Format("{0}{1}", q.Year, q.Quarter)) <= Convert.ToInt32(finInfo));

我收到一个简单的 Union 命令的错误:

var quartComb = quartEst.Union(quartAct);

这是错误:

Instance argument: cannot convert from 'System.Collections.Generic.List<AnonymousType#1>' to 'System.Linq.IQueryable<AnonymousType#2>'

我需要做什么才能实现这种合并?

4

2 回答 2

6

要使用该Union方法,集合必须具有相同的类型。为了使两个匿名类型被认为是相同的,它们必须具有完全相同的成员和完全相同的类型。

尝试这个:

var quartEst = Quarterly_estimates
    ...
    .Select (q => new {
        Tick = q.Ticker,       // renamed ticker to Tick
        Quarter = q.Quarter,
        Year = q.Yyyy,
        Eps = q.Eps})
    ...

var quartAct = Quarterlies
    .Select (q => new {
        Tick = q.Ticker,
        Quarter = q.Quarter,
        Year = q.Yyyy,
        Eps = q.Eps_adj})
    ...

var quartComb = quartEst.Union(quartAct);
于 2013-06-27T02:56:41.963 回答
0

要转换两种不同的匿名类型,您必须将其转换为动态,这是下面的代码

protected void Page_Load(object sender, EventArgs e)
    {
        List<AlertInfo> alert = new List<AlertInfo>();
        alert.Add(new AlertInfo() { StratId = 1, GroupId = 1 });
        alert.Add(new AlertInfo() { StratId = 1, GroupId = 2 });
        alert.Add(new AlertInfo() { StratId = 1, GroupId = 3 });
        alert.Add(new AlertInfo() { StratId = 2, GroupId = 1 });
        alert.Add(new AlertInfo() { StratId = 2, GroupId = 2 });
        alert.Add(new AlertInfo() { StratId = 2, GroupId = 3 });
        alert.Add(new AlertInfo() { StratId = 3, GroupId = 1 });
        alert.Add(new AlertInfo() { StratId = 3, GroupId = 2 });

        //To know how much data will get stored
        var totalDataStore = alert.Select(x => x.StratId).Distinct().ToList();

        var result = alert.Where(x => x.StratId == 1).Select(x => new { Data1 = "Group" + x.StratId + x.GroupId }).Cast<dynamic>().Union(alert.Where(y => y.StratId == 2).Select(y => new { Data2 = "Group" + y.StratId + y.GroupId })).ToList();

    }
}

public class AlertInfo
{
    public int StratId { get; set; }
    public int GroupId { get; set; }
}
于 2013-10-10T01:46:08.477 回答