2011-12-07 18 views
0

で別の列の値に基づいて列を選択する:.NET 4.0とLINQはエンティティに、VS2010、C#を使用して、Select a specific column based on another column's valueが、LINQでは、私の質問はここ1に似ているLINQ

はここに私がいるスニペットです問題と:

var BillingNumbers = (from o in mycontext.MyOrders 
        where o.Status.Description.Trim().ToUpper().Equals("SHIPPED") 
        && (o.ActualShipDate >= date1.Date && o.ActualShipDate < date2.Date) 
        select new 
          {BillingNumber = (
          o.SiteID == "NYC"? o.NYCBillingNumber.Trim(): 
          o.SiteID == "DAL" ? o.DallasBillingNumber.Trim(): "unknown") 
          }); 
      foreach (var billingnumber in BillingNumbers) 
      { 
       sqlcmd = MyDatabase.GetStoredProcCommand("MyBillingNumberSP") as SqlCommand; 
       sqlcmd.CommandTimeout = Int32.Parse(Settings.Default.SQL_COMMAND_TIMEOUT.ToString()); 
       MyDatabase.AddInParameter(sqlcmd, "@BillingNumber", DbType.String, billingnumber); 
       MyDatabase.AddOutParameter(sqlcmd, "@MyOutputParam", DbType.Boolean, 1); 
       LobjDS = MyDatabase.ExecuteDataSet(sqlcmd); //GETTING AN ERROR HERE 
       bool JobbingApplied = Convert.ToBoolean(MyDatabase.GetParameterValue(sqlcmd, "@MyOutputParam")); 
       Console.WriteLine(billingnumber); 
      } 

ExecuteDataSetコマンドはメッセージでInvalidCastExceptionがスローされます:

は<からパラメータ値を変換に失敗しました> f__AnonymousType0`1文字列に変換します。

何が間違っていますか、この匿名型が文字列として解釈しようとするとエラーが発生するのはなぜですか?

答えて

2

MyDatabase.AddInParameter(sqlcmd, "@BillingNumber", DbType.String, billingnumber.BillingNumber); 

var billingnumber

MyDatabase.AddInParameter(sqlcmd, "@BillingNumber", DbType.String, billingnumber); 

を交換しては、1つの文字列プロパティBillingNumberと匿名型です。そのプロパティを参照する必要があります。自動的に最初のメンバーに変換されるわけではありません。

代替は、あなたがすべてで匿名型を必要としない

select (
    o.SiteID == "NYC"? o.NYCBillingNumber.Trim(): 
    o.SiteID == "DAL" ? o.DallasBillingNumber.Trim(): "unknown") 

select new 
{ BillingNumber = (
    o.SiteID == "NYC"? o.NYCBillingNumber.Trim(): 
    o.SiteID == "DAL" ? o.DallasBillingNumber.Trim(): "unknown") 
} 

を交換することです。

+0

ありがとうございます。 billingnumber.BillingNumberよりもエレガントな方法がありますか? – FMFF

+1

あなたは選択を ' o.SiteID ==" NYC "を選択するように変更できますか? o.NYCBillingNumber.Trim(): o.SiteID == "DAL"? "(IEnumerable 'を返します)、残りのコードはそのまま残すことができます – Keith