5

私はLINQで以下を実行しようとしています

double totalDistance = (from g in db.Logs join 
    h in db.Races on g.raceId equals h.RaceId 
    where g.userId == id select h.distance).Sum();

ただし、エラーが発生します。

具体化された値が null であるため、値型 'Double' へのキャストが失敗しました。結果の型のジェネリック パラメーターまたはクエリのいずれかで、null 許容型を使用する必要があります。

追加してみました?? 0; そのような:

double totalDistance = (from g in db.Logs join 
    h in db.Races on g.raceId equals h.RaceId 
    where g.userId == id select h.distance).Sum() ?? 0;

ただし、他の投稿で示唆されているように、これによりエラーが発生します。

演算子「??」オペランド double または int には適用できません

助言がありますか?

編集:私のモデル

namespace RacePace.Models
{
public class Race
{
    public int RaceId { get; set; }

    [DisplayName("Race Setting")]
    public string place { get; set; }
    [DisplayName("Distance (km)")]
    public double distance { get; set; }
    [DisplayName("Date")]
    public DateTime date { get; set; }
    [DisplayName("Commencement Time")]
    public DateTime timeStarted { get; set; }
    [DisplayName("Active")]
    public Boolean active { get; set; }
    [DisplayName("Description")]
    public string description { get; set; }
    [DisplayName("Creator")]
    public int UserId { get; set; }
}
}
4

4 に答える 4

2

作成するには、モデルで距離をnullable doubleにする必要があります?? 仕事。http://msdn.microsoft.com/en-us/library/ms173224.aspxから:

?? 演算子は null 合体演算子と呼ばれ、null許容値型または参照型の既定値を定義するために使用されます。

したがって、モデルを次のように変更します

public double? distance { get; set; }

作るべき?? 仕事

于 2013-03-28T15:54:59.970 に答える
1

それらをすべてダブルにキャストします。

double totalDistance = (double)((from g in db.Logs join h in db.Races on g.raceId equals h.RaceId where g.userId == id select h.distance).Sum() ?? 0);

編集: double.Parse を使用してみてください

var someObject = (from g in db.Logs join h in db.Races on g.raceId equals h.RaceId where g.userId == id select h.distance);
double totalDistance = (someObject !=null)? someObject.Sum() : 0;
于 2013-03-28T15:30:37.553 に答える
0

ところで、これらのいずれかが正しい答えでない場合は、お知らせください。削除します。-1 クレイジーになる必要はありません。

Null許容合計を使用したLinqクエリによる

あなたは試すことができます

double totalDistance = 
   (from g in db.Logs join h in db.Races 
    on g.raceId equals h.RaceId where g.userId == id 
    select h).Sum(x => x.distance) ?? 0;

将来のより良いアプローチは、コンパイル方法に影響を与える奇妙な暗黙のキャストがある場合に何が起こっているのかがわかるまで、nullable を使用することです。編集:そうです

double? totalDistanceTemp = 
       (from g in db.Logs join h in db.Races 
        on g.raceId equals h.RaceId where g.userId == id 
        select h).Sum(x => x.distance);
double totalDistance = totalDistanceTemp ?? 0;

それがうまくいかない場合は、nullable へのキャストを試すことができます。これはリテラル キャストではなく、キャスト式を含む LINQ 式/クエリ可能なオブジェクトを構築するコードの一部であり、そのキャスト式はバックエンドで何かに変換する必要がありますただし、必ずしも翻訳する必要があるかどうかはわかりません。

double? totalDistanceTemp = 
       (from g in db.Logs join h in db.Races 
        on g.raceId equals h.RaceId where g.userId == id 
        select h).Sum(x => (Double?) x.distance);
double totalDistance = totalDistanceTemp ?? 0;

また

double? totalDistanceTemp = 
       (from g in db.Logs join h in db.Races 
        on g.raceId equals h.RaceId where g.userId == id 
        select ((Double?)h.distance )).Sum();
double totalDistance = totalDistanceTemp ?? 0;

最後に、それがうまくいかない場合は、それを台無しにしてください。データベースからリストを取得し、LINQ to Objects で合計します (nullable は必要ありません)。最後の努力としてのみ使用してください。これを行うべきではありません/する必要はありませんが、プロジェクトの LINQ to any provider は、本当に見掛け倒しまたは古いだけです。

double totalDistance = 
       (from g in db.Logs join h in db.Races 
        on g.raceId equals h.RaceId where g.userId == id 
        select h.distance).AsEnumerable().Sum();

これらのいずれも機能しない場合は、その結合がどのように変換されるかについて、何かおかしなことがあるに違いありません。それは、私が行方不明であるか、プロバイダーが何かおかしなことをしている (または、もちろん上記のいずれでもない) ことです。

于 2013-03-28T16:20:41.457 に答える
-1

ロジックの残りの部分にアクセスできないと、判断が少し難しくなりますが、やってみます。そもそもなぜnullになるのか個人的にはもっと心配ですが、nullが期待される結果である場合は、null許容型を使用できる可能性があります。詳細については、MSDN を参照してください。null 許容型を使用する場合は、2 倍の totalDistance ラインを超える前に値を確認する必要もあります。これは、MSDN リンクで説明されています。

于 2013-03-28T15:39:06.830 に答える