web-dev-qa-db-ja.com

タイプ「.List <AnonymousType#1>」を「.List <WebApplication2.Customer>」に暗黙的に変換することはできません

リストを返す次のコードでは:

public List<Customer> GeAllCust()
{
    var results = db.Customers
        .Select(x => new { x.CustName, x.CustEmail, x.CustAddress, x.CustContactNo })
        .ToList()
    return results;
}

C#がリストを変換できないというエラーレポートが表示されます。

エラー:タイプSystem.Collections.Generic.List<AnonymousType#1>System.Collections.Generic.List<WebApplication2.Customer>に暗黙的に変換できません

何故ですか?

エラーのツールチップでVisual Studioが提供する追加情報を示すスクリーンショットを次に示します。

テーブル全体ではなく、いくつかの列を返すのは正しい方法ですか?

public object GeAllCust()
{
       var results = db.Customers.Select(x => new { x.CustName, x.CustEmail, x.CustAddress, x.CustContactNo }).ToList();
        return results;
}
14
Abdul Khaliq

コードを見ると:

x => new { ... }

これにより、新しい 匿名型 が作成されます。特定の列のセットのみをプルバックする必要がない場合は、次の操作を実行できます。

return db.Customers.ToList();

これは、CustomersIEnumerable<Customer>は、返そうとしているものと一致するはずです。

編集

列の特定のサブセットのみを返したいと述べました。これをコーディングするときに何らかのコンパイラのヘルプが必要な場合は、値を保持するカスタムクラスを作成する必要があります。

public class CustomerMinInfo
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Address { get; set; }
    public int? ContactNumber { get; set; }
}

次に、関数を次のように変更します。

public List<CustomerMinInfo> GetAllCust()
{
    var results = db.Customers.Select(x => new CustomerMinInfo()
    {
        Name = x.CustName,
        Email = x.Email,
        Address = x.Address,
        ContactNumber = x.CustContactNo
    })
    .ToList();

    return results;
}

これは機能しますが、ただし、データベースコンテキストとの関係はすべて失われます。つまり、戻り値を更新しても、データベースに戻されません。

また、私のコメントを繰り返すために、(バイト配列を除いて)より多くの列を返すことは、必ずしもより長い実行時間を意味するわけではありません。多くの行を返すと、実行時間が長くなります。関数はデータベース内のすべての単一の顧客を返します。システムが大きくなると、列の数が少なくても、プログラムがハングし始めます。

20
gunr2171

Customerではない匿名タイプを選択しています。

これを(一種の)行いたい場合は、次のように書くことができます:

return db.Customers.Select(x => new Customer { Name = x.CustName, Email = x.CustEmail, Address = x.CustAddress, ContactNo = x.ContactNo }).ToList();

これは、Customerオブジェクトのプロパティが私がそれらと呼んでいるものであると想定しています。

**編集**コメントごとに、

テーブルのサブセットを返す場合は、次の2つのいずれかを実行できます。

  1. 上記で指定したCustomerの翻訳された形式を返す、または:
  2. これらの4つのフィールドのみを含むビジネスレイヤーの新しいクラスを作成し、List<ShrunkenCustomer>を返すようにメソッドを変更します(ShunkenCustomerは新しいクラスに選択した名前であると想定しています)。
6
Mark Avenius

GetAllCust()Customerのリストを返すことになっています。Select Newは匿名型のリストを作成します。クエリからCustomerのリストを返す必要があります。試してください:

var results = db.Customers.Select( new Customer{CustName = x.CustName}).ToList(); //include other fields
4
robasta

Customerは自分で定義したクラスだと思いますか?私の提案は次のようなことをすることです:

var results = db.Customers.Select(x => new Customer(x.Custname, x.CustEmail, x.CustAddress, x.CustContactNo)).ToList();

その理由は、Customerのリストを返そうとしているが、リンクからの結果は、これらの4つの値を含む匿名クラスであるためです。もちろん、これには、これらの4つの値を取得するコンストラクターが必要です。

1
kumaheiyama

基本的に、uがvar型で取得したものはすべてループし、それをlist <>オブジェクトに格納してから、ループしてurターゲットを達成します。ここで、マスターの詳細のコードを投稿します。リストobj = new List();

        var orderlist = (from a in db.Order_Master
                         join b in db.UserAccounts on a.User_Id equals b.Id into abc
                         from b in abc.DefaultIfEmpty()
                         select new
                         {
                             Order_Id = a.Order_Id,
                             User_Name = b.FirstName,
                             Order_Date = a.Order_Date,
                             Tot_Qty = a.Tot_Qty,
                             Tot_Price = a.Tot_Price,     
                             Order_Status = a.Order_Status,
                             Payment_Mode = a.Payment_Mode,
                             Address_Id = a.Address_Id 

                         });


        List<MasterOrder> ob = new List<MasterOrder>();

        foreach (var item in orderlist)
        {

            MasterOrder clr = new MasterOrder();
            clr.Order_Id = item.Order_Id;
            clr.User_Name = item.User_Name;
            clr.Order_Date = item.Order_Date;
            clr.Tot_Qty = item.Tot_Qty;
            clr.Tot_Price = item.Tot_Price;
            clr.Order_Status = item.Order_Status;       
            clr.Payment_Mode = item.Payment_Mode;
            clr.Address_Id = item.Address_Id;              
            ob.Add(clr);


        }



        using(ecom_storeEntities en=new ecom_storeEntities())
        {
            var Masterlist = en.Order_Master.OrderByDescending(a => a.Order_Id).ToList();


            foreach (var i in ob)
            {
                var Child = en.Order_Child.Where(a => a.Order_Id==i.Order_Id).ToList();
                obj.Add(new OrderMasterChild 
                {
                    Master = i,
                    Childs = Child
                });
            }        


        }
0