我怎么能在Linq完成这个?

时间:2012-04-30 19:00:44

标签: c# linq

我觉得以下可能是一种暴行,也许这就是为什么它不起作用。 我在这里,请求你的帮助。 : - )

另外请帮我编辑这个问题。我不知道什么是合适的标题或更好的方式来制定它。 (就像你现在可能已经猜到的那样,英语不是我的母语)。

考虑一个类:

public class Order
{
  public int FareCode;
  public int Quantity;
}

然后Linq查询如下:

var orders = new []{ new Order {...}, ...};
var fareCodes = orders.Select(o => o.FareCode).ToArray();
using(var dc = new datacontext())
{
  var query = dc.Fares
              .Where(f => fareCodes.Contains(f.FareCode))
              .Select(f => new {
                Fare = f,
                Quantity = orders.Single(o => o.FareCode == f.FareCode).Quantity //<-- This is not right!
              })
}

所以Quantity = Orders.Single(o => o.FareCode == f.FareCode).Quantity是对的。那么实现这一目标的另一个选择是什么?

更新:它不起作用的原因是因为运行时抛出此异常:除了Contains()运算符之外,本地序列不能用于查询运算符的LINQ to SQL实现

2 个答案:

答案 0 :(得分:2)

根据您的上一条评论,请尝试以下解决方案:

var query = Fares
        .Where(f => fareCodes.Contains(f.FareCode)).ToList()
        .Select(f => new
                         {
                             Fare = f,
                             Quantity = Orders.Single(o => o.FareCode == f.FareCode).Quantity
                         });

答案 1 :(得分:1)

因此,对于每个Order,您希望将FareCode更改为关联的Fare,并将每个Fare的数量相加,而无需点击您的datacontext每一个Order

我会在Orders列表中使用GroupBy / ToDictionary组合,并在ToDictionary()列表中使用Fares

// generates a dictionary of fare codes and total quantity of orders per fare code
var fareQuantities = Orders.GroupBy(o => o.FareCode).ToDictionary(og => og.Key, og => og.Sum(o => o.Quantity));

using(var dc = new datacontext())
{
    var query = dc.Fares
        .Where(f => fareQuantities.Keys.Contains(f.FareCode))
        .ToDictionary(f => f, f => fareQuantities[f.FareCode]);
    // query is now a dictionary of fares and the total quantities of each fare ordered
}

希望有所帮助。