我想执行这样的查询:
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.
答案 0 :(得分:4)
它正在尝试将查询转换为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
,否则您最终会获取<强大的>太多数据到内存中。
答案 1 :(得分:1)
试试这个:
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();
答案 2 :(得分:1)
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();
答案 3 :(得分:1)
正如有些人所说,你不能在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");
}
}
实际来想一想。报废ConvertToPersianToShow
,了解日期格式的DateTime.ToString(string)
。