2

私は次の関数を持っています(それが重要な場合は、WCF サービスでホストされています):

    public List<IceVsRepositoryFile> GetRepositoryFilesByRepositoryId(int repId)
    {
        var entity = new IceVSEntities();
        var files = from p in entity.Files where p.RepositoryId == repId select p.FileId;
        List<long> iList = files.ToList();
        var repFiles = from p in entity.RepositoryFiles where iList.Contains(p.FileId) select p;

        if (!repFiles.Any())
            return null;

        var retFiles = repFiles.ToList().Select(z => new IceVsRepositoryFile
            {
                FileId = (int)z.FileId,
                RollbackFileId = (int)z.RollbackFileId,
                UserId = (int)z.UserId,
                FileContents = z.FileContents,
                ChangeDescription = z.ChangeDescription
            }).ToList();

        return retFiles;
    }

この関数を実行すると、「LINQ to Entities はメソッド 'Boolean Contains(Int64)' メソッドを認識せず、このメソッドはストア式に変換できません」という次のエラーが表示されます。

エラー メッセージが表示される理由を理解しました。私の質問は、クエリを書き直して、これを期待どおりに機能させるにはどうすればよいですか? SqlLite 3 の場合は、バックエンド データベースです。私は .NET 3.5 を使用しています。

4

3 に答える 3

1

私は参加がこれを行うことができると信じています:

public List<IceVsRepositoryFile> GetRepositoryFilesByRepositoryId(int repId)
{
  var entity = new IceVSEntities();    

  var repFiles = from file in entity.Files where file.RepositoryId == repId join repFile in entity.RepositoryFiles on repFile.FileId equals file.FileId select repFile;

  var retFiles = // as before

  return retFiles;

}
于 2012-08-13T01:28:50.383 に答える
1

使用した contains は for ですList。IEnumerable にはないため、対応する SQL クエリに変換できません。Any代わりに、次のように , ...を使用できます。

iList.Any(x=>x == p.FileId) (or use related property)

また、代わりに:

List<long> iList = files.ToList();

クエリで使用files.Any...して、DB からのフェッチが多すぎるのを防ぎます。実際には、関数の代わりに IEnumerable 関数を使用してListください。

于 2012-08-12T22:40:48.933 に答える
0

Files と RepositoryFiles の間に関係はありますか? もしそうなら、次のようなことをする方が簡単でしょう:

var repFiles = from p in entity.RepositoryFiles where p.File.RepositoryId == repId select p;

これにより、クエリを SQL に変換できないという問題が回避されます。

于 2012-08-12T23:19:39.090 に答える