2016-08-12 70 views
0

我有一個LINQ查詢從表中提取數據,我想,被賦予一個日期,將其轉換爲星期(例如,它是一年中的哪一週)。MVC LINQ不被識別的方法

var query = from booking in context.BookingTables 
         join transport in context.TransportAllotments on booking.TransportAllotmentID equals transport.TransportAllotmentID 
         join passenger in context.Passengers on booking.BookingID equals passenger.BookingID 
         join result in context.QuestionaireResults on passenger.PassengerID equals result.PassengerID 
         join question in context.QuestionaireQuestions on result.QuestionaireQuestionID equals question.QuestionaireQuestionID 
         where transport.DepartureDate >= startDate && transport.DepartureDate <= endDate && booking.BookingID == id 

         select new QuestionaireDetailsDTO() 
         { 
          ID = booking.BookingID, 
          Date = transport.DepartureDate, 
          Question = question.QuestionText, 
          Week = GetWeekOfYear(transport.DepartureDate) 

         }; 

而且GetWeekofYear功能:

private int GetWeekOfYear(DateTime d) 
{ 
    var cal = System.Globalization.DateTimeFormatInfo.CurrentInfo.Calendar; 
    return cal.GetWeekOfYear(new DateTime(d.Year, d.Month, 1), System.Globalization.CalendarWeekRule.FirstDay, System.DayOfWeek.Sunday); 
} 

在當前狀態下,當我試圖測試(使用郵差/小提琴手)我收到以下錯誤:

LINQ to Entities does not recognize the method 'Int32 GetWeekOfYear(System.DateTime)' method, and this method cannot be translated into a store expression

+0

你需要物化你先查詢內存 - var query =(from booking ..... where ....).ToList()。Select(x => new QuestionaireDetailsDTO(){....});' –

+0

我已經通過在對象中設置了一個getter來解決它,但我還有另外一個問題。我怎樣才能阻止序列化爲一些對象屬性json和只有序列化,如果我想?我試過[IgnoreDataMember],但似乎並沒有做到這一點,因爲我想。 @StephenMuecke – Florin

+1

你需要提出一個新的問題和相關的細節。 –

回答

3

發生錯誤是因爲Linq2Sql無法將GetWeekOfYear方法轉換爲SQL。

嘗試以下方法:

  • 選擇原始數據,而不是成QuestionaireDetailsDTO

    select new QuestionaireDetailsDTO() { 
        DepartureDate = transport.DepartureDate 
    }; 
    
  • 添加getter到QuestionaireDetailsDTO,做計算:

    public string Week => GetWeekOfYear(DepartureDate); 
    

這種方式轉換髮生在內存而不是數據庫上。

如果GetWeekOfYear方法駐留在DTO使用者無法訪問的項目中,請在從數據庫中選擇DTO後添加後處理步驟。

foreach (var result in query) { 
    result.Week = GetWeekOfYear(result.DepartureDate); 
} 
+0

非常感謝。它使用getter工作。 – Florin

2

您可以通過使用.AsEnumerable做到這一點()

var query = from booking in context.BookingTables 
        join transport in context.TransportAllotments on booking.TransportAllotmentID equals transport.TransportAllotmentID 
        join passenger in context.Passengers on booking.BookingID equals passenger.BookingID 
        join result in context.QuestionaireResults on passenger.PassengerID equals result.PassengerID 
        join question in context.QuestionaireQuestions on result.QuestionaireQuestionID equals question.QuestionaireQuestionID 
        where transport.DepartureDate >= startDate && transport.DepartureDate <= endDate && booking.BookingID == id 
        .AsEnumerable() 
        select new QuestionaireDetailsDTO() 
        { 
         ID = booking.BookingID, 
         Date = transport.DepartureDate, 
         Question = question.QuestionText, 
         Week = GetWeekOfYear(transport.DepartureDate) 

        }; 

希望它能幫助。

+0

謝謝,先生! – Florin

0

正如所記載的,這是因爲LinqToSQL無法將您的方法轉換爲SQL。 我認爲來自@GeorgPatscheider的回答不是最好的,因爲你不應該改變你的數據對象,因爲一些特定的數據訪問層機制。 因此,來自@PhongDao的答案更加酷,但他的解決方案將從數據庫下載太多的領域。你可以這樣改變你的代碼:

var query = from booking in context.BookingTables 
     join transport in context.TransportAllotments on booking.TransportAllotmentID equals transport.TransportAllotmentID 
     join passenger in context.Passengers on booking.BookingID equals passenger.BookingID 
     join result in context.QuestionaireResults on passenger.PassengerID equals result.PassengerID 
     join question in context.QuestionaireQuestions on result.QuestionaireQuestionID equals question.QuestionaireQuestionID 
     where transport.DepartureDate >= startDate && transport.DepartureDate <= endDate && booking.BookingID == id 
     // select only fields which we need 
     select new 
      { 
       ID = booking.BookingID, 
       Date = transport.DepartureDate, 
       Question = question.QuestionText, 
       DepartureDate = transport.DepartureDate 
      } 
     // retrieve data from DB 
     .ToArray() 
     // create items which you need 
     .Select(x=> 
     new QuestionaireDetailsDTO() 
     { 
      ID = x.ID, 
      Date = x.Date, 
      Question = x.Question, 
      Week = GetWeekOfYear(x.DepartureDate) 
     }) 
     // forming results 
     .ToArray(); 
+0

我已經通過在對象中設置了一個getter來解決它,但我還有另一個問題。 如何防止序列化爲一些對象屬性json和只有序列化它,如果我想?我試過[IgnoreDataMember],但似乎並沒有做到這一點,因爲我想。 – Florin

+1

我認爲這應該是單獨的問題。 – tym32167