【问题标题】:C# - linq join select - operating on original selected objectsC# - linq join select - 对原始选定对象进行操作
【发布时间】:2015-05-03 14:10:04
【问题描述】:

在我的 C# .NET 应用程序中,我有两个对象:Article,它是一些已定义的文章及其总价格(意思是应该通过将文章的价格乘以文章的数量来计算价格已订购)和 ArticleOrdered,其中包含订购的文章数量和该文章的价格。 我有两者的集合:文章集合,即数据库中所有文章的集合和仅订购文章的集合。 我现在要做的是为订购的每篇文章计算它的总价格,方法是将单篇文章的价格乘以订购的数量。 为此,我决定使用 linq 语句,它选择两个列表(所有文章列表和有序文章列表)的公共部分(当然使用 join)。现在的问题是我必须使用orderedArticles 中的字段对Article 类型的原始对象执行一些操作(计算最终价格)。现在我做所有事情(非常糟糕;))方式:

       var commonArticles = from art in articlesList
            join orderedArt in orderedArticlesList on art.Id equals orderedArt.Id
            select art;

        var commonOrderedArticles = from art in articlesList
            join orderedArt in orderedArticlesList on art.Id equals orderedArt.Id
            select orderedArt;

        foreach (var art in commonArticles)
        {
            foreach (var orderedArt in commonOrderedArticles)
            {
                if (art.Id == orderedArt.Id)
                {
                    art.Price += orderedArt.QuantityOrdered*orderedArt.Price;
                }
            }

        }

...因为它使我能够处理文章的引用。 两个 linq 语句之间的唯一区别是,在第一个语句中我选择 art,而在第二个语句中选择 orderedArt。 如何使这两个 linq 语句合二为一并对原始文章的对象进行正确的计算?我曾考虑在那里使用 new 关键字选择一些匿名类型,但据我所知,这将返回全新的类型,所以在 art.Price 上工作我不会工作在参考(原始)对象上,但在副本上。 这也是为什么我现在必须执行这些奇怪的 foreach 循环并检查对应的 Id 是否相同。

感谢您的帮助!

【问题讨论】:

    标签: c# linq join


    【解决方案1】:

    如果orderedArticlesList 不包含一篇文章的多个条目(即相同的Id 在列表中没有出现两次),您可以这样做:

    var orderedArticalTotals =
        from ordered in orderedArticlesList 
        from article in articlesList
        where article.Id == ordered.Id
        select new {
            Article = article,
            OrderTotals = ordered.QuantityOrdered * ordered.Price
        }
    
    foreach (var total in orderedArticalTotals) 
        total.Article.Price += total.OrderTotals;
    

    如果orderedArticlesList中的同一篇文章可以有多个条目:

    var orderedArticalTotals =
        from ordered in orderedArticlesList 
        group ordered by ordered.Id into g
        select new {
            Article = articlesList.Single(a => a.Id == g.Id),
            OrderTotals = g.Sum(o => o.QuantityOrdered * o.Price)
        }
    

    并以同样的方式进行更新:

    foreach (var total in orderedArticalTotals) 
        total.Article.Price += total.OrderTotals;
    

    【讨论】:

    • 实际上列表不包含多个具有相同ID的元素,所以第一种方式完全可以。非常感谢,这正是我想要的;)。我没想过在里面创建带有类型引用的匿名类型...
    猜你喜欢
    • 2011-03-04
    • 2022-07-18
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    相关资源
    最近更新 更多