2013-06-27 8 views
5

sto cercando di combinare 2 liste da questi:Come unire le query LINQ di lambda che restituiscono di tipo anonimo?

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

ottengo l'errore per un semplice comando dell'Unione:

var quartComb = quartEst.Union(quartAct); 

Ecco l'errore:

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

Cosa fare Devo fare per raggiungere questa unione?

risposta

6

Per utilizzare il metodo Union, le raccolte devono avere lo stesso tipo. Affinché due tipi anonimi possano essere considerati uguali, devono avere esattamente gli stessi membri con esattamente gli stessi tipi.

Prova questo:

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); 
+1

1+ o ticker rinominato Ticker? – Olrac

+0

@loy sì, anche quello funzionerebbe. In realtà non importa quale sia il nome fintanto che è lo stesso. –

0

Per lanciare due diversi tipi anonimi che dovete gettarlo ai dinamica, ecco il codice qui sotto

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