[System.DateTime]类型无法被转换为SQL。

4
我想执行这样的查询:
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; }
}

在这个查询中,我使用一个函数将我的日期时间转换为另一种格式进行展示,我使用这个函数来实现这个目的:
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. 

你不应该在数据访问层中处理视图逻辑。 - Aron
是的,你说得对。我会进行更改。 - SSC
4个回答

4

它试图将查询转换为SQL,但不知道如何转换ConvertToPersianToShow方法。

解决方案是在where子句后调用ToList()以将实体带入内存,然后执行选择操作:

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,否则将会把太多的数据提取到内存中。


抱歉使用扩展方法语法,我只是觉得它更性感 ;) - khellang
非常感谢您。 - SSC

1
尝试这个:

try this:

 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();

参考资料: 方法x没有支持的SQL翻译


完全不是一个好主意。我怀疑它会不会起作用。如果能够起作用的话,只有通过Linq To Object可能实现。 - Aron
如果你仍然遇到那个错误,我会看看khellang做了什么。先将其提取到内存中,然后再投影到supervisorAnswerQuesttionPres中。 - Hink

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();

我之前在另一个项目中调用过这个方法,它能够正常工作,但是我不知道为什么在这里不能正常工作。 - SSC
在另一个项目中,您使用了完全相同的查询吗? - Maryam Arshi
不,我的意思是在查询语法之间使用ConvertToPersianToShow,它可以工作。 - SSC

1

正如一些人所指出的那样,你不能在SQL中运行C#(好吧...让我们忽略SQL CLR)。

然而,你真正的问题来自于你设计不佳的程序。

你的数据层正在执行显示逻辑,这是微软工程师所不期望的。

你应该先将数据从数据库中取出,然后在显示逻辑中使用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)进行日期时间格式化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接