リストを返す次のコードでは:
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;
}
コードを見ると:
x => new { ... }
これにより、新しい 匿名型 が作成されます。特定の列のセットのみをプルバックする必要がない場合は、次の操作を実行できます。
return db.Customers.ToList();
これは、Customers
がIEnumerable<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;
}
これは機能しますが、ただし、データベースコンテキストとの関係はすべて失われます。つまり、戻り値を更新しても、データベースに戻されません。
また、私のコメントを繰り返すために、(バイト配列を除いて)より多くの列を返すことは、必ずしもより長い実行時間を意味するわけではありません。多くの行を返すと、実行時間が長くなります。関数はデータベース内のすべての単一の顧客を返します。システムが大きくなると、列の数が少なくても、プログラムがハングし始めます。
Customer
ではない匿名タイプを選択しています。
これを(一種の)行いたい場合は、次のように書くことができます:
return db.Customers.Select(x => new Customer { Name = x.CustName, Email = x.CustEmail, Address = x.CustAddress, ContactNo = x.ContactNo }).ToList();
これは、Customer
オブジェクトのプロパティが私がそれらと呼んでいるものであると想定しています。
**編集**コメントごとに、
テーブルのサブセットを返す場合は、次の2つのいずれかを実行できます。
Customer
の翻訳された形式を返す、または:List<ShrunkenCustomer>
を返すようにメソッドを変更します(ShunkenCustomer
は新しいクラスに選択した名前であると想定しています)。GetAllCust()
はCustomer
のリストを返すことになっています。Select
Newは匿名型のリストを作成します。クエリからCustomerのリストを返す必要があります。試してください:
var results = db.Customers.Select( new Customer{CustName = x.CustName}).ToList(); //include other fields
Customer
は自分で定義したクラスだと思いますか?私の提案は次のようなことをすることです:
var results = db.Customers.Select(x => new Customer(x.Custname, x.CustEmail, x.CustAddress, x.CustContactNo)).ToList();
その理由は、Customer
のリストを返そうとしているが、リンクからの結果は、これらの4つの値を含む匿名クラスであるためです。もちろん、これには、これらの4つの値を取得するコンストラクターが必要です。
基本的に、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
});
}
}