如何从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;
可能会工作。
答
var person = ctx.persons.Where(p => p.login == currentLogin).FirstOrDefault();
if(person != null){ var obj = new {Prop = person.Column, personid = person.id});}
有趣的想法,以'Where'后跟空'SingleOrDefault',奇怪的是,它编译成两个'SELECT'语句。但我想这是EF最接近的一个。 – wondra
我对这个主题的研究越多,我越相信这个解决方法就是(唯一的)答案。我不会建议使用它,除非有非常大的斑点你不想被发送(规模较小,这是提出问题的原始原因),但它并没有使它不那么正确。 – wondra
如果您不想从数据库中检索所有内容,则需要在“SingleOrDefault”之前使用“选择”。为了能够通过未选择的属性来过滤结果,在“选择”之前需要一个“Where”。 –