Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 返回EF方法语法中单个对象的选定属性_C#_Entity Framework_Linq - Fatal编程技术网

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);