【问题标题】:[System.DateTime])' has no supported translation to SQL[System.DateTime])' 没有支持的 SQL 转换
【发布时间】:2014-02-27 22:44:07
【问题描述】:

我想执行这样的查询:

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. 

【问题讨论】:

  • 您不应该在数据访问层中执行视图逻辑。
  • 是的,你是对的。我会改变它

标签: c# linq datetime


【解决方案1】:

它正在尝试将查询转换为 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,否则您最终会获取 太多数据进入内存。

【讨论】:

  • 很抱歉使用了 synax 扩展方法,我觉得它更性感 ;)
  • 非常感谢
【解决方案2】:

试试这个:

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

参考:Method x has no supported translation to SQL

【讨论】:

  • 根本不是一个好主意。我怀疑它会起作用。如果它确实有效,它将通过 Linq To Object。
  • 嗯,如果你仍然得到那个错误,我会看看 khillang 做了什么。先读取内存,然后投射到 supervisorAnswerQuesttionPres。
【解决方案3】:

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

【讨论】:

  • 我之前在另一个项目中调用过这个方法,它有效,我不知道为什么在这里不起作用
  • 在另一个项目中您使用了相同的确切查询?
  • 不,我的意思是在查询语法之间使用 ConvertToPersianToShow 并且它有效,
【解决方案4】:

正如一些人所指出的,您不能在 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)的日期时间格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 2010-10-04
    • 2011-02-13
    • 1970-01-01
    相关资源
    最近更新 更多