Выбор столбца на основе значения другого столбца с помощью LINQ - PullRequest
0 голосов
/ 07 декабря 2011

Мой вопрос похож на приведенный здесь: Выберите определенный столбец на основе значения другого столбца , но в LINQ, используя VS2010, C #, .Net 4.0 и LINQ to Entities

Вотфрагмент, с которым у меня возникла проблема:

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в строку.

Что не так и почему этот анонимный тип выдает ошибку при попытке интерпретировать его как строку?

1 Ответ

2 голосов
/ 07 декабря 2011

Заменить

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

на

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

var billingnumber - это анонимный тип с одним строковым свойством BillingNumber.Вам нужно сослаться на это свойство, оно не может быть автоматически преобразовано в его первый член.

Альтернативой является замена

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

на

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

Тогда вы не сможетевообще не нужен анонимный тип.

...