C# 如何在EF中从SingleOrDefault LINQ查询中选择列的子集

C# 如何在EF中从SingleOrDefault LINQ查询中选择列的子集,c#,entity-framework,linq,entity-framework-6,C#,Entity Framework,Linq,Entity Framework 6,使用SingleOrDefaultquery时,如何选择所有列的子集?例如,下面是LINQ表达式 var personid = ctx.persons.SingleOrDefault(p => p.login == currentLogin)?.personid; 将编译为从…查询类型中选择TOP 1*。我想Select()只选择我感兴趣的栏目,例如,语句生成选择TOP 1 personid,myColumn FROM…UnderHood 请注意,这个问题不可能是重复的。我对Single

使用
SingleOrDefault
query时,如何选择所有列的子集?例如,下面是LINQ表达式

var personid = ctx.persons.SingleOrDefault(p => p.login == currentLogin)?.personid;
将编译为
从…
查询类型中选择TOP 1*。我想
Select()
只选择我感兴趣的栏目,例如,语句生成
选择TOP 1 personid,myColumn FROM…
UnderHood

请注意,这个问题不可能是重复的。我对
Single
/
SingleOrDefault
的上下文感兴趣,而不是LINQ的通用解决方案。使用
.SingleOrDefault()
链接
.Select()
是不可能的,原因很明显:
Single
返回类型为
T
(或抛出)的单个对象,该对象显然没有实现
IEnumerable
,并且不能被
Select()

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

可能会有用。

有趣的想法是
其中
后跟空的
SingleOrDefault
,奇怪的是它编译成两个
SELECT
语句。但我想这是最接近EF的方法了。我对这个问题做的研究越多,我就越相信这个解决方法是唯一的答案。我不建议使用它,除非你真的不想发送大的blob(规模较小,这是问这个问题的最初原因),但它不会降低它的正确性。如果你不想从数据库中检索所有内容,你需要在
SingleOrDefault
之前选择
。为了能够按未选择的属性筛选结果,在
选择
之前需要一个
Where