0
Amounts = 
    Context.Ppm_TblCodeType
    .Where(bc => bc.OrganisationId == Contract.OrganisationId)
    .Select(bc => new MacroPaymentValue
    {
        Code = bc.CodeTypeCode,
        ShortName = bc.ShortDescription,
        ValueForPayment = visits
            .Where(v => v.Detail.CodeTypeCode == bc.CodeTypeCode)
            .Sum(v => v.Detail.Charge != null ? v.Detail.Charge.Value : 0)
     }).ToArray();

例外が発生します。ローカル シーケンスは、Contains 演算子を除くクエリ演算子の LINQ to SQL 実装では使用できません。

私はそれが .Sum() 呼び出しに関係していると推測しています...例外を回避するためにこれを変更するにはどうすればよいですか?

4

2 に答える 2

3

これは、クエリの一部としてコード内のローカル シーケンスを使用しようとしてvisitsおり、LINQ to SQL がこれを SQL に変換できないために発生しています。

あなたのコードを見ると、クエリ結果がメモリに格納されたら、ValueForPayment を設定したほうがよいと思います。何かのようなもの:

Amounts = 
    Context.Ppm_TblCodeType
    .Where(bc => bc.OrganisationId == Contract.OrganisationId)
    .Select(bc => new MacroPaymentValue
    {
        Code = bc.CodeTypeCode,
        ShortName = bc.ShortDescription,
        CodeTypeCode = bc.CodeTypeCode,
        ValueForPayment = 0
     }).ToArray();

foreach(var bc in Amounts) 
{
    bc.ValueForPayment = visits
            .Where(v => v.Detail.CodeTypeCode == bc.CodeTypeCode)
            .Sum(v => v.Detail.Charge != null ? v.Detail.Charge.Value : 0)
}
于 2012-11-09T14:18:18.600 に答える
2

visitssum() を呼び出しているからではなく、を使用しようとしているために例外がスローされます。訪問リストを作成しているコードの一部を含めると役立つ場合があります...

それはどこから来ているのですか?代わりに、この同じステートメント内でクエリを実行できますか?

したがって、次のようなものが機能します。

Context...Select(bc => new MacroPaymentValue() 
{
    //stuff
    ValueForPayment =     bc.visits.sum(...)
});

実際、このクエリの最後で ToArray() を強制していることに気付きました。訪問のクエリで同じことを行うと、クエリがローカル シーケンスに変わります。visits クエリの ToArray() 部分を取り除くだけで、他の linq クエリで使用できる IQueryable が残ります。

したがって、訪問が TblCodeType の外部から来る必要がある場合は、ToArray() を使用しないようにすることができます。

基本的に、ローカル配列を linq to sql クエリで使用することはできません (ほとんどの場合)。ただし、linq to sql クエリで別のクエリを使用することはできます。ToArray() または ToList() を呼び出すと、実際にクエリが実行され、結果が取得され、それらがローカル シーケンス (呼び出し方に応じて配列またはリスト) に格納されます。実際に値の使用を開始するまでクエリは実行されません。そうすれば、クエリはクエリのままであり、他のクエリで安全に使用できます。

于 2012-11-09T14:20:20.740 に答える