2013-06-27 19 views
5

Tôi đang cố gắng để kết hợp 2 danh từ sau đây:Làm thế nào để kết hợp LINQ truy vấn của lambdas mà trở về của loại vô danh?

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

tôi nhận được lỗi cho một lệnh Liên minh đơn giản:

var quartComb = quartEst.Union(quartAct); 

Dưới đây là các lỗi:

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

gì Tôi cần phải làm gì để đạt được sự hợp nhất này?

Trả lời

6

Để sử dụng phương thức Union, các bộ sưu tập phải có cùng loại. Để hai loại vô danh được xem là giống nhau, chúng phải có chính xác cùng một thành viên với cùng loại chính xác.

Hãy thử điều này:

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+ Hoặc ticker đổi tên thành Mã cổ phiếu? – Olrac

+0

@loy yep, điều đó cũng sẽ hoạt động. Nó thực sự không quan trọng tên là miễn là nó giống nhau. –

0

Để đúc hai loại Anonymous khác nhau mà bạn phải bỏ nó để năng động, Đây là mã dưới đây

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; } 
} 
Các vấn đề liên quan