2014-01-06 5 views
1

Мне было поручено исправить некоторые проблемы в приложении C#, которое кто-то сделал (кто-то покинул компанию), и я не являюсь на самом деле квалифицированным программистом на C# Я немного застрял в следующем.C# change linq list (int) item to (string)

var JobQuery = (from datavalue in dc.JobInformations 
    where datavalue.JobOpen != 20 
    select new 
    { 
    datavalue.JobID, 
    datavalue.CompanyName, 
    datavalue.Contact, 
    datavalue.Date, 
    datavalue.HireOrSale, 
    datavalue.JobOpen, 
    datavalue.Notes 
    } 
    ); 

var JobList = JobQuery.ToList(); 

Во всяком случае мне нужно взять список и цикл через него, который я могу сделать, используя что-то вроде этого:

foreach (var item in JobList){ 
    if (item.HireOrSale = 1) { 
     item.HireOrSale = "Sale"; 
    } 
    yield return item; 
} 

Как вы можете видеть, что я пытаюсь сделать, это изменить аренду или продажу который хранится как INT для строки для лучшего чтения на переднем конце, я не могу преобразовать строку в int, где я застреваю. Есть ли способ, который я могу сказать, построить другой список в цикле, чтобы я мог определить тип данных для каждого в случае его разного? или есть способ напрямую изменить тип данных элементов?

Б:

  var JobList = (from datavalue in dc.JobInformations 
          where datavalue.JobOpen == 1 
          select new 
          { 
           JobID = datavalue.JobID, 
           CompanyName = datavalue.CompanyName, 
           Contact = datavalue.Contact, 
           Date = datavalue.Date.ToShortDateString(), 
           HireOrSale = datavalue.HireOrSale == 2 ? "Service" : 
           datavalue.HireOrSale == 0 ? "Hire" : 
           datavalue.HireOrSale == 1 ? "Sale" : "", 
           JobOpen = datavalue.JobOpen == 1 ? "Awaiting Quote" : 
           datavalue.JobOpen == 2 ? "Quoted" : 
           datavalue.JobOpen == 3 ? "PO Recieved" : 
           datavalue.JobOpen == 4 ? "Goods On Order" : 
           datavalue.JobOpen == 5 ? "Goods Delivered" : 
           datavalue.JobOpen == 6 ? "Job Complete" : 
           datavalue.JobOpen == 20 ? "Job Cancelled" : "", 
           Notes = datavalue.Notes 
          } 
          ); 
+0

Если у вас есть небольшой и конечное число значений для 'HireOrSale', я бы создать' enum' для него и использовать целое значение перечисления, чтобы получить имя перечисления (то есть, вызов 'ToString() 'на значение enum * *). – Tim

ответ

5
var JobQuery = (from datavalue in dc.JobInformations 
    where datavalue.JobOpen != 20 
    select new 
    { 
     JobID = datavalue.JobID, 
     CompanyName = datavalue.CompanyName, 
     Contact = datavalue.Contact, 
     Date = datavalue.Date, 
     HireOrSale = datavalue.HireOrSale==1?"Sale":"",//if not 1, use your default value 
     JobOpen = datavalue.JobOpen, 
     Notes = datavalue.Notes 
    } 
    ); 

var JobList = JobQuery.ToList(); 
+0

Закончилось, используя что-то вроде этого, см. Мой оригинальный пост. – Sam

0

Правильное решение, чтобы создать еще один объект, только с информацией, необходимой для переднего конца (А ViewModel), который будет содержать только поля, необходимые для показа из JobInformation:

примером может быть ...

JobInfoViewModel

Строка HireOrSale INT Дата JobId DateTime

, а затем вы можете создать список и работать с этим!

Таким образом, вы только передаете переднюю часть необходимой информации, не более, не меньше!

1

Чтобы расширить комментарий Тима на ваш вопрос, это может быть очень хорошо использовать для enum, если у вас есть несколько вариантов, каждый отображается на номер:

public enum HireOrSale 
{ 
    None = 0, 
    Sale = 1, 
    SomethingElse = 2, 
    MoreStuff = 3 
} 

Затем в своем заявлении LINQ вы может сделать HireOrSale = (HireOrSale)datavalue.HireOrSale для преобразования int в правильное значение enum.

Когда приходит время его отображения, вы можете просто позвонить ToString и напечатать имя enum. Например, короткий сегмент кода ниже будет печатать «Продажа».

int input = 1; 
HireOrSale enumValue= (HireOrSale)input; 
String displayValue = enumValue.ToString();