簡體   English   中英

[System.DateTime])'沒有支持的SQL轉換

[英][System.DateTime])' has no supported translation to SQL

我想執行這樣的查詢:

List<supervisorAnswerQuesttionPres> temp =
    (from i in dbconnect.tblAnswerLists
    where i.StudentNum == studentNumber
    select new supervisorAnswerQuesttionPres
    {
        answerList = _resAnswerList,
        questionList = _resQuestionist,
        date = ConvertToPersianToShow(i.dateOfAnswer.Value.Date)
    }).OrderBy(i => i.date).ToList();

我返回此查詢的類是這樣的:

public class supervisorAnswerQuesttionPres
{
    public string date { set; get; }
    public List<string> questionList { set; get; }
    public List<string> answerList { set; get; }
}

在這個查詢中,我使用一個函數將我的Datetime轉換為另一個演示文稿我使用此函數:

public string ConvertToPersianToShow(DateTime? datetime)
{
    string date;
    DateTime dt;

    if (!datetime.HasValue) return "";
    dt = datetime.Value;
    //  dt = datetime;

    string year = Convert.ToString(persian_date.GetYear(dt));
    string month = Convert.ToString(persian_date.GetMonth(dt));
    string day = Convert.ToString(persian_date.GetDayOfMonth(dt));

    if (month.Length == 1)
    {
        month = "0" + Convert.ToString(persian_date.GetMonth(dt));
    }

    if (day.Length == 1)
    {
        day = "0" + Convert.ToString(persian_date.GetDayOfMonth(dt));
    }

    Convert.ToString(persian_date.GetMonth(dt)) + "/" +
            +                 dt.Minute + ")";
    date = year + "/" + month + "/" + day;
    return date;
}

這個函數只是轉換我的DateTime,但是當我執行查詢時出現了這個錯誤:

Method 'System.String ConvertToPersianToShow(System.Nullable`1[System.DateTime])' has no supported translation to SQL. 

它試圖將查詢轉換為SQL,但不知道如何轉換ConvertToPersianToShow方法。

解決方案是在where子句之后調用ToList()將實體帶入內存,然后執行select:

var temp = dbconnect.tblAnswerLists
    .Where(i => i.StudentNum == studentNumber)
    .ToList() // <-- This will bring the data into memory.
    .Select(i => new supervisorAnswerQuesttionPres
        {
            answerList = _resAnswerList,
            questionList = _resQuestionist,
            date = ConvertToPersianToShow(i.dateOfAnswer.Value.Date)
        })
    .OrderBy(i => i.date)
    .ToList()

調用ToList() ,查詢將被轉換為SQL,例如

SELECT * FROM <table> WHERE StudentNum = '<studentNumber>'

並針對數據庫執行。 當數據返回並且您將其存儲在內存中時,您可以使用LINQ to Objects來進一步查詢和操作數據。

注意! 通常,在添加至少一個where子句之前,應該小心調用ToList ,否則最終會將太多數據提取到內存中。

試試這個:

 var temp = (from i in dbconnect.tblAnswerLists
                    let pDate = ConvertToPersianToShow(i.dateOfAnswer.Value.Date)
                    where i.StudentNum == studentNumber

                    select new PresentClass.supervisorAnswerQuesttionPres
                    {
                        answerList = _resAnswerList,
                        questionList = _resQuestionist,
                        date = pDate
                    }).OrderBy(i => i.date).ToList();

reference: 方法x沒有支持的SQL轉換

LINQ to SQL不知道如何將調用方法'ConvertToPersianToShow'轉換為SQL以便在服務器上執行where子句。 您的方法在服務器上不存在。

也許這樣的東西會有所幫助,但是如果它不起作用你應該獲取你的數據,然后將它改為你希望它顯示為的方式

List<PresentClass.supervisorAnswerQuesttionPres> temp 
= (from i in dbconnect.tblAnswerLists
   let PDate=ConvertToPersianToShow(i.dateOfAnswer.Value.Date)
   where i.StudentNum == studentNumber
   select new PresentClass.supervisorAnswerQuesttionPres
   {
    answerList = _resAnswerList,
    questionList = _resQuestionist,
    date = PDate
   }).OrderBy(i=>i.date).ToList();

正如有些人所說,你不能在SQL中運行C#(好吧......讓我們忽略SQL CLR)。

但是,你真正的問題來自你的架構很差的程序。

您的數據層正在執行顯示邏輯,並且沒有一個Microsoft工程師期望這樣做。

您應該首先將數據從數據庫中刪除。 然后在您的顯示邏輯上使用ConvertToPersianToShow(DateTime?)綁定到您的視圖。

public class SupervisorAnswerQuestion
{
    public DateTime? Date { set; get; }
    public List<string> Questions { set; get; }
    public List<string> Answers { set; get; }
}

public class SupervisorAnswerQuestionViewModel
{
    public SupervisorAnswerQuestion SupervisorAnswerQuestion {get;set;}
    public string DateFormated 
    {
        get { return SupervisorAnswerQuestion.Date.ToString("yyyy/MM/dd");
    }
}

實際來想一想。 Scrap ConvertToPersianToShow ,學習日期時間格式的DateTime.ToString(string)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM