2012-05-10 70 views
2

非常基本的問題。我該如何修改Linq結果?修改Linq結果

爲了進一步闡述,我從數據庫中的訂單表中選擇了訂單清單。我需要在網頁表單的gridview中顯示結果。首先,我需要修改一些結果。例如,當「訂單」字段有值時,「報價」字段應該更改爲空白。我可能需要對結果進行更精細的操作。在過去,可以循環訪問數組並修改它們,但是今天的編程似乎不希望發生循環。目前結果似乎是隻讀的,就好像我因爲需要修改列表而做錯了事情。

protected void fillGridView() 
{ 
    using (CqsDataDataContext cqsDC = new CqsDataDataContext()) 
    { 
     var orderlist = from x in cqsDC.MasterQuoteRecs 
         where x.CustomerNumber == accountNumber && x.DateCreated > DateTime.Now.AddDays(howfar) 
         orderby x.DateCreated descending 
         select new 
         { 
          customer = x.customername, 
          order = x.OrderReserveNumber, 
          quote = x.Quote, 
          date = Convert.ToDateTime(x.DateCreated).ToShortDateString(), 
          project = x.ProjectName, 
          total = x.Cost, 
          status = x.QuoteStatus 
         }; 


     // I would like to loop thru list and make changes to it here 

     GridView1.DataSource = orderlist; 
     GridView1.DataBind(); 

    } 
} 
+0

如果要進行更改,請更改查詢。順便說一句,這不是一個列表。 –

+0

在查詢中,我需要做的更改(在路上)可能無法完成。什麼是對象而不是列表? – Dave

+1

你是試圖在數據庫中進行更改,還是隻是爲了顯示?如果您試圖在數據庫中進行更改,請將其更改爲「select x」,進行所需的更改,最後執行'cqsDC.SubmitChanges();'。如果只是爲了顯示,使它成爲'quote = x.Order == null? x.Quote:null'。 –

回答

2

您最終得到IQueryable<anonymoustype>與您當前的查詢。由於它們是匿名類型,因此它們是隻讀的,無論如何都不能更改。

你最好的選擇,特別是如果你打算有更復雜的操作,不能在數據庫的查詢中完成,則是使用類。您還需要在查詢結尾處添加一個ToList(),以便最終生成List<YourClass>,然後可以像平常一樣循環並更改對象。

因此,讓一類具有所有的屬性,例如MasterQuote,並用它在你的查詢,而不是:

var query = from x in cqsDC.MasterQuoteRecs 
       where x.CustomerNumber == accountNumber && x.DateCreated > DateTime.Now.AddDays(howfar) 
       orderby x.DateCreated descending 
       select new MasterQuote 
       { 
        Customer = x.customername, 
        Order = x.OrderReserveNumber, 
        Quote = x.Quote, 
        Date = Convert.ToDateTime(x.DateCreated).ToShortDateString(), 
        Project = x.ProjectName, 
        Total = x.Cost, 
        Status = x.QuoteStatus 
       }; 

var orderList = query.ToList(); 

foreach (var item in orderList) 
{ 
    if (item.OrderReserveNumber > 0) 
    { 
     item.Quote = ""; 
    } 
} 

MasterQuote類看起來是這樣的:

public class MasterQuote 
{ 
    public string Customer { get; set; } 
    public int Order { get; set; } 
    // and so on 
} 

當然對於您給定的示例,您可能可以在查詢中完成引用操作,如seth mentioned

+0

這聽起來像我最好的選擇。你有什麼關於如何做到這一點的鏈接?我對Linq有點新鮮。 – Dave

+0

還沒有嘗試過,但這看起來像會起作用。謝謝。 – Dave

1

只需使用三元運算符。

select new 
{ 
    customer = x.customername, 
    order = x.OrderReserveNumber, 
    quote = x.OrderReserveNumber != null ? string.Empty : x.Quote, 
    date = Convert.ToDateTime(x.DateCreated).ToShortDateString(), 
    project = x.ProjectName, 
    total = x.Cost, 
    status = x.QuoteStatus 
}; 
1

取決於變化是多麼複雜,但你提到的那個可以用一個簡單的方法在靜態類上完成。

您可以將linq語句鏈接在一起,併爲quote列做相應的sql case。

OrderList似乎不太可能實現IEnumerable,所以如果所有的linq太亂了,foreach會做這項工作。