2011-12-07 58 views
0

值我的问题是一个类似于此:Select a specific column based on another column's value但在LINQ,使用VS2010,C#,.NET 4.0和LINQ到实体选择列基于另一列与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); 

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

var billingnumber是匿名类型与一个字符串属性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”? o.DallasBillingNumber.Trim():“unknown”)'(它将返回一个IEnumerable '),然后你可以保留原来的代码 – Keith