Linq構文-複数の列の選択


96

これは私のエンティティモデルに使用しているLinq構文です

IQueryable<string> objEmployee = null;

objEmployee = from res in _db.EMPLOYEEs
              where (res.EMAIL == givenInfo || res.USER_NAME == givenInfo)
              select res.EMAIL;

複数の列を選択するにはどうすればよいですか?同様にres.IDも選択したいと思います。そして、どうすればそれらを受け取ることができますか?IQueryableは機能しないと思います。これはLinq to SQLと呼ばれます


3
LinqToSqlとエンティティフレームワークは異なります。stackoverflow.com/questions/8676/…を
ギデオン'21 / 07/21

回答:


189

他の回答が示しているように、匿名型を使用する必要があります。

構文に関する限り、私は個人的にはメソッドの連鎖を好みます。同等のメソッドチェーンは次のようになります。

var employee = _db.EMPLOYEEs
    .Where(x => x.EMAIL == givenInfo || x.USER_NAME == givenInfo)
    .Select(x => new { x.EMAIL, x.ID });

AFAIK、宣言型LINQ構文は、コンパイル時にこれと同様のメソッド呼び出しチェーンに変換されます。

更新

オブジェクト全体が必要な場合は、の呼び出しを省略しますSelect()。つまり、

var employee = _db.EMPLOYEEs
    .Where(x => x.EMAIL == givenInfo || x.USER_NAME == givenInfo);

72

たとえば、匿名型を使用できます。

  var empData = from res in _db.EMPLOYEEs
                where res.EMAIL == givenInfo || res.USER_NAME == givenInfo
                select new { res.EMAIL, res.USER_NAME };

この式を適切に書く方法を提案できますか?select new {(DateTime.Now-負債。クレーム日付)、負債。?エラーがスローされます:無効な匿名型メンバーの宣言
Dainius Kreivys

1
@DainiusKreivys select new { Diff = (DateTime.Now - debt.ClaimDate), Amount = debt.Amount}。回答で使用される形式は省略形であり、初期化式のメンバー名は匿名型のフィールド名として使用されます。たとえば、new {res.EMAIL, res.USER_NAME}はの省略形ですnew {EMAIL = res.EMAIL, USER_NAME = res.USER_NAME}。日付の場合のように式がある場合-省略形は適用できないため、コンパイラエラーが発生します。
Ivan Danilov

5
 var employee =  (from res in _db.EMPLOYEEs
 where (res.EMAIL == givenInfo || res.USER_NAME == givenInfo)
 select new {res.EMAIL, res.USERNAME} );

または使用できます

 var employee =  (from res in _db.EMPLOYEEs
 where (res.EMAIL == givenInfo || res.USER_NAME == givenInfo)
 select new {email=res.EMAIL, username=res.USERNAME} );

説明 :

  1. resとしてdbから従業員を選択します。

  2. where条件に従って従業員の詳細をフィルタリングします。

  3. 新しい{}を使用して匿名オブジェクトを作成することにより、従業員オブジェクトから必須フィールドを選択します


答えに説明を追加してください。
Sandeep、

さまざまな列にどのようにアクセスしますか?
ARidder101 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.