1

我要做的是创建一个自定义类型,该类型具有一个自定义属性,该属性将存储记录中的 Id 和 Name 。(类似于“223 - 罗伯特·史密斯”)。这就是我正在做的事情:

return (from c in db.Credores
        where c.Status == true
        select new CredorCompleto
        {
            Id = c.Id,
            Nome = c.Nome,
            NomeCompleto = c.Id + c.Nome,
            CNPJ = c.CNPJ
        }).ToList();

更新: “CredorCompleto”的定义

public class CredorCompleto
{
    public string NomeCompleto { get; set; }
    public string CNPJ { get; set; }
    public string Nome { get; set; }
    public int Id { get; set; }
}

这就是我得到的:

无法将类型System.Int32转换为 type System.Object。LINQ to Entities 仅支持转换实体数据模型基元类型。

4

5 回答 5

4

您对@Moon 回答的评论提供了一个重要线索:

“LINQ to Entities 无法识别方法System.String Format(System.String, System.Object, System.Object)method,并且该方法无法转换为存储表达式。”

问题可能在于它db.Credores是一个IQueryable,而不仅仅是一个IEnumerable。因此,当您的 LINQ to SQL 提供程序尝试分析您的原始查询时,它会遇到一些它无法识别的问题,并且不知道如何转换为 SQL 查询。

我想 LINQ to SQL 提供程序在将您的连接c.Id + c.Nome转换为有效的 SQL 语句时遇到问题,可能是因为前者是 anint而后者是 a string

可以肯定的是,它绝对不知道如何将调用转换string.Format()为 SQL(这并不奇怪,因为 SQL 没有那个功能)。

因此,您可以在执行特定于 .NET 的逻辑之前尝试执行 SQL 查询。试试这个:

return db
       .Credores
       .Where(c => c.Status == true)
       .AsEnumerable() // <-- this should trigger the execution of the SQL query
       .ToList()       // <-- and if it does not, then this certainly will
       .Select(c => new CredorCompleto
                    {
                        …
                    })
       .ToList();

调用.AsEnumerable()- 并且.ToList()可能还需要调用,IIRC - 将触发 SQL 查询的执行。之后的一切都在内存中运行IEnumerable,而不是在IQueryable. 这意味着在 之后.ToList(),LINQ 将不再做智能代码分析,或尝试将剩余的运算符转换为 SQL。

于 2012-08-16T14:32:42.333 回答
0

假设并返回正确.ToString()的值,您可以这样做:c.Idc.Nome

return (from c in db.Credores
        where c.Status == true
        select c).AsEnumerable()
        .select(x => new CredorCompleto()
        {
            Id = c.Id.ToString(),
            Nome = c.Nome,
            NomeCompleto = string.Format("{0} - {1}", c.Id, c.Nome),
            CNPJ = c.CNPJ
        }).ToList();

正如所建议的那样Victor,“LINQ to Entities 无法识别该方法System.String Format(System.String, System.Object, System.Object)

因此,请使用AsEnumerable()Linq to Objects 强制评估该部分。

于 2012-08-16T14:15:59.860 回答
-1

您试图连接一个 int 和一个字符串。尝试...

NomeCompleto = c.Id.ToString() + " - " + c.Nome,
于 2012-08-16T14:14:34.020 回答
-2

您询问

像“223 - 罗伯特史密斯”)。

用这个

return (from c in db.Credores
                        where c.Status == true
                        select new CredorCompleto
                        {
                            Id = c.Id,
                            Nome = c.Nome,
                            NomeCompleto = c.Id + " - " + c.Nome,
                            CNPJ = c.CNPJ
                        }).ToList();

编辑:看到你的班级结构后,我猜你的错误是在其他地方没有给出问题。

于 2012-08-16T14:11:17.660 回答
-2

尝试

return (from c in db.Credores
    where c.Status == true
    select new CredorCompleto
    {
        Id = c.Id,
        Nome = c.Nome,
        DescricaoCompleta = c.Id+"-"+c.Nome,
        CNPJ = c.CNPJ
    }).ToList();
于 2012-08-16T14:14:19.707 回答