0

以下は残虐行為かもしれないと感じています。それがうまくいかない理由かもしれません。だからここにいます、あなたの助けを求めています。:-)

また、この質問の編集を手伝ってください。適切なタイトルが何であるか、またはそれを定式化するためのより良い方法がわかりません. (もうお察しのとおり、英語は私の母国語ではありません)。

次のようなクラスを考えてみましょう:

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 実装では使用できません

4

2 に答える 2

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
                         });
于 2012-04-30T19:03:29.577 に答える
1

したがって、 for each のように見えますが、 を関連するOrderに変更し、すべてのデータ コンテキストにヒットすることなく、それぞれの数量を合計します。FareCodeFareFareOrder

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
}

それが役立つことを願っています。

于 2012-04-30T19:48:51.440 に答える