1

Linq to Entities を使用して新しいオブジェクトに投影する方法があるかどうか興味があります。最初の Linq クエリに .Where 拡張機能を追加して (実行の遅延と動的ラムダ式の構築)、プロパティに基づいてクエリをさらにフィルタリングします。投影されたオブジェクトの(そしてここに主な質問があります)データベースから1つのプロパティ(IDフィールドなど)のみを返します(生成されたselectステートメントには1つの戻り値しかありません)。

そこで、以下を変更したいと思います。

        employees = from e in context.Employee
                    select new EmployeeObject()
                    {
                            EmployeeId = e.EmployeeId,
                            EmployeeFirstName = e.FirstName,
                             EmployeeLastName = e.LastName
                    };

そのため、従業員に .Where 拡張子をラムダで追加して検索をさらに絞り込むことができますが、EmployeeId のみを返し、生成される SQL にそれを反映させることができます。

私はまだ Linq to Entities を学習中なので、適切に説明していない場合はご容赦ください。

ありがとうございました!

4

2 に答える 2

1

あなたはこれを行うことができます:

var employeeIds = from e in context.Employee
                  select new {
                      EmployeeID = e.EmployeeId
                  };

匿名型を介して必要な 1 つのプロパティのみを返します。または、次のようにします。

var employeeIds = context.Employee.Where(/*filters...*/).Select(e => e.EmployeeId);
// another alternative: 
var employeeIds = from e in context.Employee select e.EmployeeId;

これにより、IDのみが提供されます。

編集:
クエリを列挙しない限り、クエリは実行されません。
だからあなたが言うなら

var query = context.Employee;

追加の句で好きなだけ装飾できる非常に単純なクエリがあります。

query = query.Where(e => e.LastName.StartsWith("S"));
query = query.Where(e => e.FirstName == "Blah");

これらの追加はすべてクエリを実行していないため、ObjectContext が有効である限り、そのようにクエリを絞り込むことができます。

句の追加が完了したら、最終的な射影を追加できます

var results = query.Select(e => e.EmployeeId);

その場合にのみ、列挙するresultsか、どこかで使用する必要があります。もちろん、フィルタリングを実行した後にのみプロジェクションを追加できます。これは、定義ごとに、プロジェクションは EmployeeId 以外のすべてのプロパティを削除するだけだからです。

于 2012-05-02T13:28:16.823 に答える
0

完全に理解できるかどうかはわかりませんが、理解できませんでした。

context.Employee.Where(x => x.FirstName = "Bob").Select(x => x.Id);
于 2012-05-02T13:28:52.663 に答える