2017-08-29 4 views
2

SingleOrDefaultクエリを使用しているときに、すべての列のサブセットを選択するにはどうすればよいですか?たとえば、LINQの式の後にEFでSingleOrDefault LINQクエリから列のサブセットを選択する方法

var personid = ctx.persons.SingleOrDefault(p => p.login == currentLogin)?.personid; 

SELECT TOP 1 * FROM ...クエリの種類にコンパイルします。 Select()に興味のある列のみをご希望です。納税者番号SELECT TOP 1 personid, myColumn FROM ...アンダーフード。

質問は恐らくlinked questionと重複することはできませんのでご注意ください。私はSingle/SingleOrDefaultのコンテキストに興味があり、LINQの汎用ソリューションではありません。明確IEnumerable<T>を実装していないと時Select() EDできないタイプTSingle<T>戻る単一のオブジェクト(またはスロー):.Select().SingleOrDefault()を連鎖することは明らかな理由のためにことは不可能です。

答えて

3
var personid = ctx.persons 
    .Where(p => p.login == currentLogin) 
    .Select(p => new {Prop = p.Column, personid = p.id}) 
    .SingleOrDefault()?.personid; 

おそらく動作しますか。

+0

興味深いアイデアは、 'Where'の後に空の' SingleOrDefault'があり、2つの 'SELECT'文にコンパイルするのに不思議です。しかし、私はそれがEFで得られる最も近いものだと思います。 – wondra

+0

トピックに関するより多くの研究をすればするほど、この回避策が唯一の答えであると確信しています。あなたが送ってほしくない本当に大きなブロブがないかぎり、私はそれを使うことを勧めません。(それほど大きなスケールでは、それは質問をする元の理由でしたが)それほど正確ではありません。 – wondra

+0

データベースからすべてを取得したくない場合は、 'SingleOrDefault'の前に' Select'が必要です。選択されていないプロパティで結果をフィルタリングするには、 'Select'の前に' Where'が必要です。 –

-2
var person = ctx.persons.Where(p => p.login == currentLogin).FirstOrDefault(); 

if(person != null){ var obj = new {Prop = person.Column, personid = person.id});} 
+0

wondra、役に立たなかったのですか?私はそれが動作するはずだと思います。 – IOTEnthu

+0

私は投票しませんでしたが、私の推測では、その理由は以前の回答とは十分に異なっていませんでした。 – wondra

+2

いいえ、私は明確にしていないし、尋ねられたことをすることができないので、これをdownvoted。これは、テーブルからすべての列を選択し、クライアント側で不要なものを破棄します。質問は最初にそれらを要求するのを避けるように頼みます。 – hvd

関連する問題