2012-05-10 7 views
2

非常に基本的な質問。 Linqの結果を変更するにはどうすればよいですか?Linqの結果を変更する

さらに詳しく説明すると、私はデータベースの注文表から注文リストを選択しました。 Webフォーム上のグリッドビューに結果を表示する必要があります。まず、いくつかの結果を修正する必要があります。たとえば、「注文」フィールドに値がある場合は、「引用」フィールドを空白に変更する必要があります。結果をより精巧に操作しなければならない可能性があります。以前は、配列をループして変更することは可能でしたが、今日のプログラミングではループが起こりたくないようです。現時点では、リストを変更する必要があるために何か間違っているかのように、結果は読み取り専用のように見えます。

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

変更する場合は、クエリを変更します。 Btw、これはリストではありません。 –

+0

私が作る必要がある変更は、クエリでは不可能かもしれません。リストとは対照的に呼び出されるオブジェクトは何ですか? – Dave

+1

DBに変更を加えようとしていますか、または表示するだけですか? DBを変更しようとするなら、 'select x'に変更し、必要な変更を行い、最後に' cqsDC.SubmitChanges(); 'を実行します。表示するだけの場合は、 'quote = x.Order == nullにしますか? x.Quote:null'。 –

答えて

2

現在のクエリではIQueryable<anonymoustype>となります。彼らは匿名のタイプなので、読み込み専用であり、とにかく変更することはできません。

特に、データベースによってクエリで実行できないより複雑な操作を行う場合は、代わりにクラスを使用することをお勧めします。また、クエリの最後にToList()を追加して、List<YourClass>になり、通常通りにループしてオブジェクトを変更することができます。

ですから、例えばMasterQuoteのために、すべてのプロパティを持つクラスを作成し、代わりにあなたのクエリであることを使用します。

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

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クラスは次のようになります与えられた例では、おそらくクエリの引用操作をseth mentionedとすることができます。

+0

それは私の最高の選択肢のように聞こえる。これを行う方法に関するリンクがありますか?私はまったく新しいLinqに少し慣れています。 – Dave

+0

まだ試したことはありませんが、動作するようです。ありがとう。 – Dave

1

3者演算子を使用してください。

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はその仕事をします。