2012-01-05 1 views
0

Linq to Entitiesクエリに続いて、「Data.InhouseUnit型の定数値を作成できません」というプリミティブ型( 'Int32、String、およびGuid' )はこのコンテキストでサポートされています "例外。Linqのエンティティフレームワーククエリへのif-else句

IList<FaultReport> faultReports = (from fr in _session.FaultReports 
    where fr.CreatedOn > dateTime 
    select new FaultReport 
    { 
     Id = fr.Id, 
     ExecutionDate = fr.ExecutionDate ?? DateTime.MinValue, 
     FaultType = fr.FaultType, 
     Quarters = fr.Quarters, 
     InhouseSpaceId = fr.InhouseSpaceId, 
     InhouseSpace = new InhouseSpace { Id = fr.InhouseSpace.Id, Name = fr.InhouseSpace.Name }, 
     InhouseUnitId = fr.InhouseUnitId ?? Guid.Empty, 
     **InhouseUnit = fr.InhouseUnitId == Guid.Empty ? null : new InhouseUnit { Id = fr.InhouseUnit.Id, Name = fr.InhouseUnit.Name }** 
}).ToList(); 

具体的には、例外を発生させる太字のif式です。私はfr.InhouseUnitIdがnullableであるので、チェックを行う必要があります。太字の表現を取り除くと、残りの文はうまくいきます。例外を引き起こしていることを理解するために、msdnフォーラムやWebでかなりの時間を費やしましたが、それでもかなり理解できません。 Guidはスカラーなので、うまくいくはずです。上記のステートメントの太字の式の代わりにこの式のInhouseUnit = true ? null: new InhouseUnit()でも動作しません。

LINQ to Entities does not recognize the method 'System.Object 
GuidConversion(System.Nullable`1[System.Guid], System.Object)' method, and this method 
cannot be translated into a store expression 
+1

私は間違っていないよ場合は、ここでの問題は、コンパイラは、それがどのようなfr.InhouseUnitIdの値ない考えを持っていないとして、SQLクエリにあなたのLINQをコンパイルすることはできないということである。このような何かGuid.Emptyはその時です。 LINQステートメントは、SQLステートメントにコンパイルするためには一定でなければなりません。 解決策がわからないので、これをコメントとして残しました。 –

+0

@DarylTeo、コンパイルは正常ですが、実行時に例外がスローされます。最初のチェックはfr.InhouseUnitId == nullです.fr.InhouseUnitIdはnull可能です。これまでLINQtoSQLでこのような式を問題なく使用してきました。これはおそらく何か変なことをしているエンティティフレームワークです。 – Xience

答えて

0

あなたが新しい内に突出しているように見えます:私たちも、私はロジックを奪うだけの結果を返すように拡張メソッドを記述しようとすると、次の例外がスローされた場合/他

を書くことができますあなたが照会しているのと同じタイプのオブジェクト。それは事実ですか?ちょっと変わったようですが、あなたがこれを行うのに十分な理由があると仮定すると、クエリを2つの部分に分割できます。最初の部分は、データベースから必要なものを得るでしょう。 2番目の部分はローカルに実行され(LINQ-to-Objects)、必要なプロジェクションが得られます。 -

var query = 
    from fr in _session.FaultReports 
    where fr.CreatedOn > dateTime 
    select new { 
    fr.Id, 
    fr.ExecutionDate, 
    fr.FaultType, 
    fr.Quarters, 
    InhouseSpaceId = fr.InhouseSpace.Id, 
    InhouseSpaceName = fr.InhouseSpace.Name, 
    InhouseUnitId = fr.InhouseUnit.Id, 
    InhouseUnitName = fr.InhouseUnit.Name, 
    }; 

IList<FaultReport> faultReports = (
    from fr in query.ToList() 
    select new FaultReport { 
    Id = fr.Id, 
    ExecutionDate = fr.ExecutionDate ?? DateTime.MinValue, 
    FaultType = fr.FaultType, 
    Quarters = fr.Quarters, 
    InhouseSpaceId = fr.InhouseSpaceId, 
    InhouseSpace = new InhouseSpace { Id = fr.InhouseSpaceId, Name = fr.InhouseSpaceName }, 
    InhouseUnitId = fr.InhouseUnitId ?? Guid.Empty, 
    InhouseUnit = fr.InhouseUnitId == Guid.Empty ? null : new InhouseUnit { Id = fr.InhouseUnitId, Name = fr.InhouseUnitName } 
    }).ToList();