将IQueryable中的DateTime投影到自定义类中的字符串

时间:2010-07-19 08:47:00

标签: c# linq-to-entities wcf-ria-services

我在使用WCF Ria Services的Silverlight应用程序的服务器部分运行此代码:

public IQueryable<PersonePM> GetPersoneByCognome(string cognome)
    {
        return
            (from p in ObjectContext.Persone
             where p.Cognome.ToLower().Contains(cognome.Trim().ToLower())
             select new PersonePM
             {
                 Id = p.ID,
                 Cognome = p.Cognome,
                 Nome = p.Nome,
                 Sesso = p.IsMaschio == true ? "M" : "F",
                 StringaCognomeNome = p.Cognome + " " + p.Nome,
                 DataNascita = p.DataNascita == null ? DateTime.MinValue : p.DataNascita.Value,
                 LuogoNascita = (p.IsMaschio == true ? "Nato a " : "Nata a ") + p.Citta.Denominazione + " (" + p.Citta.Provincia.Trim() + ")",
                 CodiceFiscale = p.CodiceFiscale,
                 StringaNascita =
                    (p.IsMaschio == true ? "Nato a " : "Nata a ") + p.Citta.Denominazione + " (" + p.Citta.Provincia.Trim() + ")"
                 +
                 (p.DataNascita != null ?
                     (((p.DataNascita.Value.Day == 1) || (p.DataNascita.Value.Day == 8) || (p.DataNascita.Value.Day == 11)) ? " l'" : " il ") +
                     p.DataNascita.Value : string.Empty)
             });            
    }

public class PersonePM
{
    [Key]
    public Guid Id { get; set; }
    public string Cognome { get; set; }
    public string Nome { get; set; }
    public string Sesso { get; set; }
    public string StringaCognomeNome { get; set; }
    public DateTime DataNascita { get; set; }
    public string LuogoNascita { get; set; }
    public string StringaNascita { get; set; }
    public string CodiceFiscale { get; set; }
}

由于意大利语,我想格式化一个人出生的地方以及何时使用共同语言形式以获得最佳用户理解。 但是上面的代码不起作用,因为Linq-to-Entities不能将DateTime转换为String(整个故事有点不同......但是我们可以简单地说);错误在这里抛出:

StringaNascita =
                    (p.IsMaschio == true ? "Nato a " : "Nata a ") + p.Citta.Denominazione + " (" + p.Citta.Provincia.Trim() + ")"
                 +
                 (p.DataNascita != null ?
                     (((p.DataNascita.Value.Day == 1) || (p.DataNascita.Value.Day == 8) || (p.DataNascita.Value.Day == 11)) ? " l'" : " il ") +
                     p.DataNascita.Value : string.Empty)

问题是众所周知的,我找到了不同的解决方案,但没有人投射到我用作演示模型的自定义类。 大约一个星期我正在解决这个问题,我还没有想出解决方案。 有什么想法吗?

谢谢!

编辑7月19日16.27GMT + 1

如果我注释掉这部分

StringaNascita =
                    (p.IsMaschio == true ? "Nato a " : "Nata a ") + p.Citta.Denominazione + " (" + p.Citta.Provincia.Trim() + ")"
                 +
                 (p.DataNascita != null ?
                     (((p.DataNascita.Value.Day == 1) || (p.DataNascita.Value.Day == 8) || (p.DataNascita.Value.Day == 11)) ? " l'" : " il ") +
                     p.DataNascita.Value : string.Empty)

一切正常。

2 个答案:

答案 0 :(得分:1)

我建议您从数据库中获取原始数据,然后再执行字符串转换。

要强制从IQueryable<T>转换为IEnumerable<T>,您可以使用AsEnumerable() - 所以您必须:

var dbQuery = from data in source
              where stuff
              select simple-projection;

var clrQuery = from data in dbQuery.AsEnumerable()
               where client-side-filters
               select client-side-projection;

如果你明白我的意思。

请注意,AsEnumerable()实际上只是更改了表达式的编译时类型,因此查询的其他位使用Enumerable.*而不是Queryable.*执行。

答案 1 :(得分:0)

现在我解决了我所问的问题:那个问题太愚蠢了没有人回复,还是我是一个天才?我认为这是第一次!感谢每个人帮助我解决问题。

<强>解决方案

public class PersonePM
{
    [Key]
    public Guid Id { get; set; }
    public string Cognome { get; set; }
    public string Nome { get; set; }
    public string Sesso { get; set; }
    public string StringaCognomeNome { get; set; }
    public DateTime DataNascita { get; set; }
    public string LuogoNascita { get; set; }

    /*Use the Getter to set the property based on other fields*/
    public string StringaNascita 
    {
        get
        {
            return LuogoNascita +
                (DataNascita != DateTime.MinValue ?
                     (((DataNascita.Day == 1) || (DataNascita.Day == 8) || (DataNascita.Day == 11)) ? " l'" : " il ") +
                     string.Format("{0:d MMMM yyyy}", DataNascita) : string.Empty);
        }
    }
    /* END of solution */

    public string CodiceFiscale { get; set; }
}

public IEnumerable<PersonePM> GetPersoneByCognome(string cognome)
    {
        return
            (from p in ObjectContext.Persone
             where p.Cognome.ToLower().Contains(cognome.Trim().ToLower())
             select new PersonePM
             {
                 Id = p.ID,
                 Cognome = p.Cognome,
                 Nome = p.Nome,
                 Sesso = p.IsMaschio == true ? "M" : "F",
                 StringaCognomeNome = p.Cognome + " " + p.Nome,
                 DataNascita = p.DataNascita.HasValue ? p.DataNascita.Value : DateTime.MinValue,
                 LuogoNascita = (p.IsMaschio == true ? "Nato a " : "Nata a ") + p.Citta.Denominazione + " (" + p.Citta.Provincia.Trim() + ")",
                 CodiceFiscale = p.CodiceFiscale,
             });
    }