2012-04-05 48 views
-2

我在EDM與代碼第一種方式工作,面對錯誤,我不能在solution.Pls幫我LINQ到實體無法識別方法「布爾CheckMeetingSettings(的Int64,Int64的)」方法

LINQ到實體無法識別方法「布爾 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. 
} 

請大家幫我出這個查詢。

回答

1

LINQ到實體無法自定義代碼轉換成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方法也可以訪問數據庫,你可能要考慮不使用一個單獨的方法,以防止一個選擇N + 1個方案,並試圖表達的邏輯查詢的一部分而言,該數據庫可以理解。

+0

感謝它的工作,但耗費大量的時間來執行查詢。我們有另一種方法快速完成它。請幫助我 – Vinay 2012-04-05 09:38:25

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)); 
+0

感謝您的迴應,但我也需要分頁。在我的數據庫中,我已經結束1 lac users.Pls給與分頁... – Vinay 2012-04-05 09:36:31

+0

@ user1314655使用'Skip'和'Take'方法分頁。您還需要使用'order by'排序查詢。看到我編輯的答案。 – Eranga 2012-04-05 09:42:12

1

實體框架,不能混用,隨着代碼的應用程序中運行在數據庫服務器上運行的代碼。您可以像這樣編寫查詢的唯一方法就是如果您在SQL Server中定義了一個函數來實現您編寫的代碼。如何該函數暴露在LINQ到實體

更多信息,可以發現here

或者,你就必須調用CheckMeetingSettings初始查詢外,作爲Eranga證明。

+0

感謝您的建議,我會按照它 – Vinay 2012-04-05 09:37:00

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

+0

感謝您的response.when我使用此代碼我有一些其他錯誤來襲即{「已經有與此命令必須先關閉相關聯的打開的DataReader。」} – Vinay 2012-04-05 09:39:54

相關問題