2012-03-05 2 views
2
次の定義と私はEFを使用しています

はどうすれば克服しない簡単なため、例外を「...タイプの一定の値を作成できません」WHERE文の

public class StoredFile 
{ 
    public int StoredFileId { get; set; } 
    public HashCode HashCode { get; set; } 
    public string LocalName { get; set; } 
    //and some more fields here... 
} 

[ComplexType] 
public class HashCode 
{ 
    public Byte [] ValueArr {get; set;} 
    public override bool Equals(object o) {...} 
    //some more methods to manipulate hash codes     
} 

は私が動作するように次のクエリを取得しようとしています:

public bool TryGetFileInfo(MachineSafeDbDataContext dataContext, HashCode hash, out StoredFile fileInfo) 
    { 
     var matches = from curr in dataContext.StoredFiles where (hash.Equals(curr.HashCode)) select curr; 

     if (matches.Count() == 0) 
     { 
      fileInfo = null; 
      return false; 
     } 

     fileInfo = matches.First(); 
     return true; 
    } 

は、しかし、私は「できませんが、タイプの一定の値を作成するために取得します。 .. "例外です。 LINQは、上記のWHEREステートメントのSQLへの変換を見つけることができないと思います。

私は以下の質問を承知しています:Entity Framework - "Unable to create a constant value of type..." exception、およびMicrosoftの次のページ:Known Issues and Considerations in LINQ to Entities。しかし、私はまだそのハッシュコードに基づいて私のDBからファイルを選択したいと思います。

ありがとう、

編集:私はL2E制限を超えているはずです。このthreadには良いポインタとリンクがあります。

答えて

2

L2Eでオーバーライドされた.Equals()を呼び出すことはできません。

ただし、直接ValueArrにドリルダウンすることができます

var matches = from curr in dataContext.StoredFiles 
       where (curr.HashCode.ValueArr == hash.ValueArr) 
       select curr; 
+0

感謝を!私はそれがバイト[](あなたは等号をオーバーライドする必要があります)で動作しないので、==は動作しませんでした。 – OSH

+0

L2Eがそれを処理します。これは、それがSQL TIMESTAMPにマップされるためです。 –

関連する問題