2

非常に基本的な質問。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();

    }
}
4

3 に答える 3

2

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

特にデータベースによるクエリでは実行できないより複雑な操作を行う場合は、代わりにクラスを使用するのが最善のオプションです。ToList()また、クエリの最後にaを追加して、最終的にaを追加し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が述べたように、クエリでQuote操作を実行できる可能性があります。

于 2012-05-10T16:36:08.880 に答える
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
};
于 2012-05-10T16:32:53.187 に答える
1

変更が実際にどれほど複雑かによって異なりますが、あなたが言及したものは、静的クラスの単純なメソッドで実行できます。

linqステートメントをチェーンして、quote列に対してsqlcaseと同等の処理を行うことができます。

OrderListがIEnumerableを実装していない可能性は低いと思われるため、すべてのlinqが乱雑になった場合は、foreachがその役割を果たします。

于 2012-05-10T16:38:32.610 に答える