-2

EDM でコード ファースト アプローチを使用していますが、解決できないエラーに直面しています。

LINQ to Entities はメソッド 'Boolean CheckMeetingSettings(Int64, Int64)' メソッドを認識せず、このメソッドはストア式に変換できません。

私のコードは次のとおりです(これは私が書いたクエリです

from per in obj.tempPersonConferenceDbSet
           where per.Conference.Id == 2
           select new PersonDetials
           {
               Id = per.Person.Id,
               JobTitle = per.Person.JobTitle,
               CanSendMeetingRequest = CheckMeetingSettings(6327,per.Person.Id)
           }

public bool CheckMeetingSettings(int,int)
{
  ///code I have written.
}

これから私を助けてください。

4

4 に答える 4

3

EF はカスタム コードを SQL に変換できません。結果セットを反復処理し、LINQ クエリの外部でプロパティを割り当ててみてください。

var people = (from per in obj.tempPersonConferenceDbSet
           where per.Conference.Id == 2
           order by /**/
           select new PersonDetials
           {
               Id = per.Person.Id,
               JobTitle = per.Person.JobTitle,
           }).Skip(/*records count to skip*/)
             .Take(/*records count to retrieve*/)
             .ToList();

people.ForEach(p => p.CanSendMeetingRequest = CheckMeetingSettings(6327, p.Id));
于 2012-04-05T08:07:05.627 に答える
1

Linq to Entities は、カスタム コードを SQL クエリに変換できません。

最初にデータベース列のみを選択し、次に .ToList() を追加してクエリを強制的に解決することを検討してください。これらの結果が得られたら、CheckMeetingSettings メソッドから情報を追加する別の選択を行います。

私は流動的な構文に慣れているので、次の例でそれを使用しました。

var query = obj.tempPersonConferenceDbSet
               .Where(per => per.Conference.Id == 2).Select(per => new { Id = per.Person.Id, JobTitle = per.Person.JobTitle })
               .ToList()
               .Select(per => new PersonDetails { Id = per.Id, 
                                                  JobTitle = per.JobTitle,
                                                  CanSendMeetingRequest = CheckMeetingSettings(6327, per.Person.Id) })

CheckMeetingSettings メソッドもデータベースにアクセスする場合は、SELECT N+1 シナリオを防ぐために別のメソッドを使用しないことを検討し、データベースが理解できる用語でロジックをクエリの一部として表現するようにしてください。

于 2012-04-05T08:04:08.037 に答える
1

Entity Framework では、データベース サーバーで実行されるコードとアプリケーション内で実行されるコードを混在させることはできません。このようなクエリを作成できる唯一の方法は、作成したコードを実装するために SQL Server 内で関数を定義した場合です。

その関数を LINQ to Entities に公開する方法の詳細については、こちらを参照してください

CheckMeetingSettingsまたは、 Eranga が示したように、最初のクエリの外で呼び出す必要があります。

于 2012-04-05T08:08:01.623 に答える
1

試す:

var personDetails = obj.tempPersonConferenceDbSet.Where(p=>p.ConferenceId == 2).AsEnumerable().Select(p=> new PersonDetials
           {
               Id = per.Person.Id,
               JobTitle = per.Person.JobTitle,
               CanSendMeetingRequest = CheckMeetingSettings(6327,per.Person.Id)
           });

public bool CheckMeetingSettings(int,int)
{
  ///code I have written.
}

AsEnumerable()プリフォームできるように使用する必要がありますCheckMeetingSettings

于 2012-04-05T08:10:17.443 に答える