linq to SQLクエリから返される列を指定する方法
-
06-07-2019 - |
質問
linq to sqlクエリからいくつかの列のみを返そうとしていますが、返そうとすると例外がスローされます:
クエリでのエンティティタイプ「InVision.Data.Employee」の明示的な構築は許可されていません
コードは次のとおりです。
return db.Employees.Select(e => new Employee()
{ EmployeeID = e.EmployeeID, FirstName = e.FirstName,
LastName = e.LastName }).ToList();
すべてを返すと、javascriptで使用するためにシリアル化する必要があるため、循環参照に関する例外がスローされます。したがって、列を本当に制限する必要があります...これを解決するためのヒントをありがとう。
解決
基本的に、列だけが必要な場合は、それらを選択します。従業員エンティティが必要な場合は、それを選択します。ここには多くの妥協点はありません。このためだけに新しいクラスを作成することはお勧めしません。うん!
これを実行:
return db.Employees
.Select(e => new { e.EmployeeID, e.FirstName, e.LastName })
.ToList();
他のヒント
Linq2Sql EntityではなくViewオブジェクトを使用してこのシナリオを処理することをお勧めする前に、Linq2SqlとSerializationと戦わなければならなかったため。そのはるかに簡単なソリューション:
return db.Employees
.Select( e => new EmployeeView()
{
EmployeeID = e.EmployeeID,
FirstName = e.FirstName,
LastName = e.LastName
}).ToList();
別の方法は、Employeeテーブルの新しいコピーをDBMLデザイナーにドラッグし、SimpleEmployeeなどの別の名前を付け、すべての関係を削除し、不要な列をすべて削除することです。
ジャスティン、
ここでそのエラーの説明: http:// devlicio.us/blogs/derik_whittaker/archive/2008/04/25/linq2sql-explicit-construction-of-entity-exception.aspx
できることの1つは、Employeeから派生するクラスを作成することです。
public class EmployeeProxy : Employee
{
}
その後、クエリを実行できます:
return db.Employees.Select(e => new EmployeeProxy { EmployeeID=e.EmployeeID, FirstName=e.FirstName, LastName=e.LastName }).ToList();
一方、結果セットをjavascriptにシリアル化するだけの場合は、匿名クラスを使用することもできます。これも同様に機能します:
return db.Employees.Select(e => new { EmployeeID=e.EmployeeID, FirstName=e.FirstName, LastName=e.LastName }).ToList();
これがお役に立てば幸いです。