2013-03-28 14 views
5

nullエラーを取得するLINQ;その後使用できませんか?私はしかし、エラーを取得LINQ</p> <pre><code>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(); </code></pre> <p>で次のコマンドを実行しようとしています

The cast to value type 'Double' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type.

私は?? 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; 

は、しかし、これはエラーを生成:よう

operator '??' cannot be applied to operands double or int

任意の提案ですか?

EDIT:私のモデル

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; } 
} 
} 
+2

'distance'はヌル可能ですか? – mattytommo

+0

残念ながら、メッセージは 'Opperator'? ' 'double'または 'float'に適用できません – NickP

+0

モデルを表示できますか? – Alex

答えて

2

あなたのモデルで距離をnullにできるようにする必要がありますか?作業。 〜からhttp://msdn.microsoft.com/en-us/library/ms173224.aspx

??オペレータは、nullで合体演算子と呼ばれ、

はそうするべき

public double? distance { get; set; } 

にモデルを変更NULL可能値の型または参照型のデフォルト値を定義するために使用されます?

+0

これは、モデルを使用する他のものに(潜在的に非常に負の)影響を及ぼす可能性があります。 – Stainy

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; 
+0

同じ問題: 'Opperator' ?? ' 'double'や 'float'には適用できません – NickP

+0

私の編集を参照してください。クエリがnullを返した場合、合計はありません。その合計が例外をスローします。 – Jegan

+0

それでもエラーはスローされますか?マテリアライズされた値がnullであるため、値の型 'Double'へのキャストは失敗しました。結果タイプの汎用パラメーターまたは照会のいずれかがNULL可能タイプを使用する必要があります。 – NickP

-1

を使用するようにしてください。 最初はなぜnullになるのか個人的には心配していますが、nullが期待される結果であれば、null可能な型を使用できる可能性があります。それらの詳細については、on MSDNをご覧ください。 null可能な型を使用する場合は、そのdouble totalDistance行を過ぎる前に値をチェックすることも必要です。これはMSDNのリンクで説明されています。

0

ご連絡先が正解でない場合は、と私にお知らせください。を削除します。 -1を狂わせる必要はありません。

あなたは

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; 

を試みることができるLinq query with nullable sum

で行くあなたは何が起こっているかを知るまでは、将来のより良いアプローチは、単にNULL可能を使用するかもしれませんもしそれがどのようにコンパイルされるかに影響を与えるいくつかの奇妙な暗黙のキャストがあります。EDIT:問題が解決しない場合、それは

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; 

、あなたがnullablesにキャストしようとすることができません。これはリテラルキャストではなく、キャスト式を含む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と合算します(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.distance).AsEnumerable().Sum(); 

これらの作品のどれもが、翻訳された結合という方法で面白いことがあってはならない場合は、そのいずれかの私が欠けているか、プロバイダが(もちろん、上記のまたはなし)奇抜な何かをやっています。

関連する問題

 関連する問題