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

问题描述:

如何在使用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解决方案感兴趣。与.Select()链接.SingleOrDefault()不可能表观原因:T类型的Single<T>返回单个对象(或抛出)这显然不实现IEnumerable<T>且不能在Select()编辑。

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

可能会工作。

+0

有趣的想法,以'Where'后跟空'SingleOrDefault',奇怪的是,它编译成两个'SELECT'语句。但我想这是EF最接近的一个。 – wondra

+0

我对这个主题的研究越多,我越相信这个解决方法就是(唯一的)答案。我不会建议使用它,除非有非常大的斑点你不想被发送(规模较小,这是提出问题的原始原因),但它并没有使它不那么正确。 – wondra

+0

如果您不想从数据库中检索所有内容,则需要在“SingleOrDefault”之前使用“选择”。为了能够通过未选择的属性来过滤结果,在“选择”之前需要一个“Where”。 –

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

不,我低估了这一点,因为它显然不符合要求。这将选择表中的所有列,然后在客户端丢弃不需要的列。这个问题首先要避免要求他们。 – hvd