返回EF方法语法中单个对象的选定属性

本文关键字:属性 对象 单个 EF 方法 语法 返回 | 更新日期: 2023-09-27 18:16:58

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

db是我们的实体框架数据上下文。

我的目标是选择与ExampleTable中提供的id匹配的单个条目。如果没有找到条目,则返回null。但是,EF似乎不允许我选择单个对象,然后只返回特定的属性。我如何做到这一点,或者我提供的第一个例子是否正确?

我检查了这个问题:选择实体ef linq:

的属性

不幸的是,你不能有条件地加载相关实体的属性——你要么加载整个门实体,要么不包括那个实体。

但是答案似乎不正确,但显然"似乎"是一个非常弱的陈述。

返回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();

你的第二个方法得到了一个对象,而不是LINQ可以处理的IQueryable<T>对象。如果你想从一种类型的对象转换到另一种类型,那不是LINQ的事情。仍然可以,但会更复杂。例如:

var selection =...; 
var newselection=new { Id=selection.Id, PropIWantToShow=selection.PropIWantToShow }; 

,但这是非常糟糕的,因为您确实从DB检索了整个对象,然后丢弃了其中的大部分。第一个方法只从DB返回2个字段。

如果你想让你的函数返回null,如果条件不匹配,那么使用FirstorDefault()而不是SingleorDefalut()。如果你想匹配一个id并返回一个对象那么这样做:

return db.ExampleTable.FirstorDefault(c=>c.Id == id);
相关文章: