2011-12-17 10 views
1

私はリストを小計しようとしています。特定の列を合計または平均する必要がありますが、他は小計には関係ありません。株価。無効な引数 - 変換できません匿名タイプ#2

私はエラー

を取得しています「 'System.Collections.Generic.List.Add(AnonymousType#1)' は、いくつかの無効な引数の引数を '1' があるために最善のオーバーロードされたメソッドの試合:セージ200クエリビルダでこれを実行していると私が間違ってやっているかを見ることができないとき「 から

「をAnonymousType#1」から「AnonymousType#2」を変換することはできません。

私はLinqpadでそれをしようとした場合、それは私に語った

任意のアイデア「名 『CXTは、』現在のコンテキスト内に存在しませんか」?ありがとう!


var q = from d in cxt.K3_StockProfitMarginByCustomers 
select new 
{ 
    d.CustomerAccountName, 
    d.CustomerAccountNumber, 
    d.Code, 
    d.Name, 
    d.Profit, 
    d.QuantitySold, 
    d.TotalCost, 
    d.TotalRevenue, 
    d.MARGIN, 
    d.SLCustomerAccountID, 
    d.SOPOrderReturnID, 
    d.SOPOrderReturnLineID 
}; 

q = q.Distinct(); 

var l = q.ToList(); 
var summary = new 
{ 
    CustomerAccountName = "", 
    CustomerAccountNumber = "", 
    Code = "", 
    Name = "", 
    Profit = (Decimal)q.Sum(o => o.Profit), 
    QuantitySold = (Decimal)q.Sum(o => o.QuantitySold), 
    TotalCost= (Decimal)q.Sum(o => o.TotalCost), 
    TotalRevenue= (Decimal)q.Sum(o => o.TotalRevenue), 
    MARGIN = (Decimal)q.Average(o => o.MARGIN), 
    SLCustomerAccountID=(String)"", 
    SOPOrderReturnID=(String)"", 
    SOPOrderReturnLineID=(String)"" 
}; 

l.Add(summary); 

return l.AsQueryable(); 

答えて

2

2匿名型は同じではありません。プロパティの名前は同じである可能性がありますが、同じ種類ではない可能性があります。ほとんどの場合、同じ型と見なされるプロパティの両方があります。

独自のクラスを作成して代わりに使用することを検討する必要があります。

3

あなたのコレクションに問題があります。

var q = from d in cxt.K3_StockProfitMarginByCustomers 

select new 
{ 
d.CustomerAccountName, 
d.CustomerAccountNumber, 
d.Code, 
d.Name, 
d.Profit, 
d.QuantitySold, 
d.TotalCost, 
d.TotalRevenue, 
d.MARGIN, 
d.SLCustomerAccountID, 
d.SOPOrderReturnID, 
d.SOPOrderReturnLineID 
}; 

これはquerableとして匿名型のオブジェクトを作成し、あなたが

q = q.Distinct(); 
var l = q.ToList(); 

を行うとき、それは1

今すぐあなたのコードは匿名タイプである別のオブジェクトの概要を初期化する匿名型#のコレクションを作成します最初の問合せで作成されたものと同じであることを識別する方法はありませんので、有名なタイプ#2としてサマリーを作成します。今度は、それをエラーの原因となる最初の型コレクションlに追加します。

ソリューション: すべてのプロパティが含まれていると要約のための

最初のクエリとleterことを使用するクラスを入力し、強く作成します。

コレクション するvar要約=新しいYOURCLASSを(作成新しいYOURCLASS {// すべてのプロパティ }

//を選択){// properyを割り当て} //コレクションに概要を追加します。

これが問題を解決します。

これは完全な例

// Create new CS file with Name MyClass 
public class MyClass 
{ 
    public string CustomerAccountName {get; set;}, 
    public string CustomerAccountNumber {get; set;}, 
     public string Code {get; set;}, 
     public string Name {get; set;}, 
     public string Profit {get; set;}, 
     public int QuantitySold {get; set;}, 
    public double TotalCost {get; set;}, 
    public double TotalRevenue {get; set;}, 
    public double MARGIN {get; set;}, 
    public int SLCustomerAccountID {get; set;}, 
    public int SOPOrderReturnID {get; set;}, 
    public int SOPOrderReturnLineID {get; set;} 
} 


// 
var q = from d in cxt.K3_StockProfitMarginByCustomers 
select new MyClass() 
{ 
    CustomerAccountName= d.CustomerAccountName, 
    CustomerAccountNumber = d.CustomerAccountNumber, 
    Code = d.Code, 
    Name = d.Name, 
    Profile = d.Profit, 
    QuantitySold= d.QuantitySold, 
    TotalCost = d.TotalCost, 
    TotalRevenue= d.TotalRevenue, 
    MARGIN = d.MARGIN, 
    SLCustomerAccountID= d.SLCustomerAccountID, 
    SOPOrderReturnID= d.SOPOrderReturnID, 
    SOPOrderReturnLineID= d.SOPOrderReturnLineID 
}; 

q = q.Distinct(); 

var l = q.ToList(); 
var summary = new MyClass() 
{ 
    CustomerAccountName = "", 
    CustomerAccountNumber = "", 
    Code = "", 
    Name = "", 
    Profit = (Decimal)q.Sum(o => o.Profit), 
    QuantitySold = (Decimal)q.Sum(o => o.QuantitySold), 
    TotalCost= (Decimal)q.Sum(o => o.TotalCost), 
    TotalRevenue= (Decimal)q.Sum(o => o.TotalRevenue), 
    MARGIN = (Decimal)q.Average(o => o.MARGIN), 
    SLCustomerAccountID=(String)"", 
    SOPOrderReturnID=(String)"", 
    SOPOrderReturnLineID=(String)"" 
}; 

l.Add(summary); 

return l.AsQueryable(); 
+0

こんにちはおかげで返信のために多くにあります。私は少し初心者ですが、解決策を理解するためにまだ苦労しています。 – Atuitive

+0

1.クエリーで選択したすべてのprotiesを含むC#でクラスを作成します(MyClass(MyClass))。クラス名) 2。 cxt.K3_StockProfitMarginByCustomersにおけるDからの新しいMyClassの(){ CustomerAccountName = d.CustomerAccountName、 d.CustomerAccountNumberを選択し、//すべてのプロパティ d.Code、 d.Name、 d.Profit、のために上記のように行います d.QuantitySold、 d.TotalCost、 d.TotalRevenue、 d.MARGIN、 d.SLCustomerAccountID、 d.SOPOrderReturnID、 d.SOPOrderReturnLineID}。 – dotnetstep

関連する問題