2016-11-08 4 views
1

作業員を追跡するASP.NETコアアプリケーションがあります。 WorkCrewMembersは乗組員を含むクラスです。それはWorkCrewクラスの鍵を持っていて、このクルーがいつ特定の曜日に作業するかを指定するTimeSpan?のフィールドが多少不器用なリストを持っています:SunStart, MonStart, TueStart, WedStart, ThuStart, FriStart, SatStart。クラスはレガシーデータベースから生成されます。私はm.WorkCrew.TodayStartTime()に沿って、次のエラーを取得しています、私は1.1にパッケージをアップグレードする場合、1.0.1.NET Core 1.1プレビュー1にアップグレードした後、LINQ文が壊れました

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     using (DBContext context = new DBContext()) { 
      var lstWorkCrew = (from m in context.WorkCrewMembers 
       where m.WorkCrew.TodayStartTime() != null 
       select m.WorkCrewId).ToList(); 
      Console.WriteLine($"Today {lstWorkCrew.Count} work crews"); 
     } 
    } 
} 

public partial class WorkCrew { 
    public TimeSpan? TodayStartTime() { 
     TimeSpan?[] starts = { 
      SunStart, MonStart, TueStart, WedStart, ThuStart, FriStart, SatStart 
     }; 
     int dayOfWeek = (int)DateTime.Now.DayOfWeek; 
     return starts[dayOfWeek]; 
    } 
} 

しかしASP.NETコアで楽しそうに働いていた次のコードを持っている:

未処理の例外:System.ArgumentExceptionの:メソッド 'System.Nullable`1【のSystem.TimeSpan] TodayStartTimeは()' タイプで宣言 'WorkCrew '可能System.Int32'

興味深いタイプのインスタンスで呼び出すことができません私がすればfrom w in context.WorkCrew where w.TodayStartTime() != null select wそれはうまく動作します。

1.1の大きな変更ですか?それとも、私のコードが合法ではないため、例外を先に投げるべきものですか?あるいは単にMicrosoftが修正するバグ?

答えて

1

SelectWhereの順番が、このLINQ表記で何らかの形で反転していて、最初に選択したIDが返されているようです。これは、Idではなくアイテム自体を選択した場合に動作する理由を説明しています。

私はあなたが

context.WorkCrewMembers 
     .Where(m => m.WorkCrew.TodayStartTime() != null) 
     .Select(m => m.WorkCrewId) 
     .ToList(); 

に変更した場合、それは正常に動作すると思います。

私は個人的にこの表記を好む:)

+0

ああを使用する必要があります! (何らかの理由で 'm.WorkCrew'がnullになったようです!)最初に' var wcm = context.WorkCrewMembers.ToList() 'を取得し、' wcm.Where(m =>) m.WorkCrew?.TodayStartTime()) ' - 例外は発生しませんが、* all *' m.WorkCrew'がnullの場合と同様に0行が返されます – Felix

+0

申し訳ありません、これは本当にバグのようですこのシンプルスニペットがどのようにこのタイプのエラーを生成するかを見てください。ここで何か問題がある場合にコンパイルすることはできません。クラス内のどこかに隠れたリフレクションコールをしないといいでしょう。 –

+0

ありがとう。いいえ - ここに隠された魔法はありません:) – Felix

0

をソリューションは、驚くほど簡単なの判明:ASP.NETコア内代わりwhere m.WorkCrew.TodayStartTime() != nullの 1.1あなたはwhere m.WorkCrew.TodayStartTime != null

関連する問題