[英]TruncateTime(System.Nullable`1[System.DateTime])' has no supported translation to 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.