2

linq から sql クエリへのいくつかの列のみを返そうとしていますが、そうすると例外がスローされます。

クエリでのエンティティ タイプ 'InVision.Data.Employee' の明示的な構築は許可されていません

コードは次のとおりです。

return db.Employees.Select(e => new Employee()
       { EmployeeID = e.EmployeeID, FirstName = e.FirstName,
         LastName = e.LastName }).ToList();

すべてを返すと、JavaScriptで使用するにはシリアル化する必要があるため、循環参照に関する例外がスローされるため、列を制限する必要があります...これを解決するために私に与えることができるヒントをありがとう。

4

3 に答える 3

3

Linq2Sql Entity ではなく View オブジェクトを使用してこのシナリオを処理することをお勧めする前に、Linq2Sql と Serialization と戦う必要があったためです。そのはるかに簡単な解決策:

return db.Employees
        .Select( e => new EmployeeView() 
        { 
            EmployeeID = e.EmployeeID, 
            FirstName = e.FirstName, 
            LastName = e.LastName 
         }).ToList();

もう 1 つの方法は、Employee テーブルの新しいコピーを DBML デザイナーにドラッグし、SimpleEmployee などの別の名前を付けて、すべての関係を削除し、不要な列をすべて削除することです。

于 2009-06-19T01:26:34.637 に答える
2

基本的に、列だけが必要な場合は、それらを選択します。従業員エンティティが必要な場合は、それを選択します。ここにはあまり中間点はありません。このためだけに新しいクラスを作成しないことをお勧めします。うん!

これを行う:

return db.Employees
   .Select(e => new { e.EmployeeID, e.FirstName, e.LastName })
   .ToList();
于 2009-06-19T01:30:33.430 に答える
0

ジャスティン、

ここでのエラーの説明: 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();

お役に立てれば。

于 2009-06-19T01:26:14.217 に答える