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タイプを タイプにキャストできませんSystem.Object。LINQ to Entities は、Entity Data Model プリミティブ型のキャストのみをサポートします。

4

5 に答える 5

4

@Moon の回答に対するあなたのコメントは、重要な手がかりを提供します。

「LINQ to Entities はメソッドSystem.String Format(System.String, System.Object, System.Object)メソッドを認識しないため、このメソッドをストア式に変換できません。」

問題は、だけでなく、 である可能性があります。そのため、LINQ to SQL プロバイダーが元のクエリを分析しようとすると、認識できないビットに遭遇し、SQL クエリに変換する方法がわかりません。db.CredoresIQueryableIEnumerable

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

への呼び出し(おそらく IIRC.AsEnumerable()への呼び出しも必要です) により、SQL クエリの実行がトリガーされます。.ToList()それ以降のすべては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 と string を連結しようとしています。試す...

NomeCompleto = c.Id.ToString() + " - " + c.Nome,
于 2012-08-16T14:14:34.020 に答える
-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 に答える
-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 に答える