C# 返回EF方法语法中单个对象的选定属性
C# 返回EF方法语法中单个对象的选定属性,c#,entity-framework,linq,C#,Entity Framework,Linq,db是我们的实体框架数据上下文 我的目标是选择一个与ExampleTable中提供的id匹配的条目。如果未找到条目,则返回null。然而,EF似乎不允许我选择单个对象,然后只返回特定属性。我如何做到这一点,或者我提供的第一个示例是否正确 我确实检查了这个问题: : 不幸的是,您不能有条件地加载相关实体的属性-您要么加载整个门实体,要么不包含该实体 但答案似乎并不正确,但显然“似乎”是一个很弱的说法 您的第一种方法是正确的: //This works, but seems inco
db
是我们的实体框架数据上下文
我的目标是选择一个与ExampleTable中提供的id匹配的条目。如果未找到条目,则返回null。然而,EF似乎不允许我选择单个对象,然后只返回特定属性。我如何做到这一点,或者我提供的第一个示例是否正确
我确实检查了这个问题:
:
不幸的是,您不能有条件地加载相关实体的属性-您要么加载整个门实体,要么不包含该实体
但答案似乎并不正确,但显然“似乎”是一个很弱的说法 您的第一种方法是正确的:
//This works, but seems incorrect to me
Object selection = db.ExampleTable
.Where(s => s.Id == id)
.Select(s => new { s.Id, s.PropIWantToShow })
.SingleOrDefault();
//This seems correct, but does not work
Object selection = db.ExampleTable
.SingleOrDefault(s => s.Id == id)
.Select(s => new { s.Id, s.PropIWantToShow });
第二种方法得到的是单个对象,而不是LINQ将使用的IQueryable
对象。如果您想从一种类型的对象转换为另一种类型的对象,这不是LINQ的事情。你仍然可以,但这会更复杂。比如:
//This works, but seems incorrect to me
Object selection = db.ExampleTable
.Where(s => s.Id == id)
.Select(s => new { s.Id, s.PropIWantToShow })
.SingleOrDefault();
但这是非常糟糕的,因为您确实从数据库中检索了整个对象,然后扔掉了大部分对象。第一个方法仅从数据库返回2个字段。如果您希望函数在条件不匹配时返回null,请使用
FirstorDefault()
而不是singleOrdefault()
。因此,如果要匹配id并返回对象,请执行以下操作:
var selection =...;
var newselection=new { Id=selection.Id, PropIWantToShow=selection.PropIWantToShow };
除了将变量声明为
对象
,第一个选择就足够了。对于匿名类型,您最好使用var
。您的问题是SingleOrDefault
返回一个项,而不是IEnumerable
,因此您不能对其使用LINQ。您认为第一段代码有什么问题?。这似乎表明我选择的是列表/可枚举/可查询/无论什么,而不是单个项,这是我担心的原因。顺便说一句,总有一天我会读你的书。编辑-同时,感谢你的回复Serhi和Jones,我只需要先回复John,他就是John和所有人。你的第一个方法是正确的。呃。。。你为什么这么说?当没有对象与条件匹配时,SingleOrDefault()仍将返回null。这两个调用之间的唯一区别是,当有多个元素匹配条件时,SingleOrDefault()将抛出(预期的)异常。EDIT:经过一些思考,这两个调用之间还有另一个区别:FirstOrDefault将只在表中运行,直到找到一个元素,然后返回;SingleOrDefault将在表中运行,直到找到第二个元素。
return db.ExampleTable.FirstorDefault(c=>c.Id == id);