从表Entity Framework中选择特定列

时间:2017-09-25 11:18:35

标签: c# entity-framework

我有一个关于使用实体框架从表中选择特定列的问题。问题是,我使用Find()方法通过主键获取我想要的表,然后从中获取一些数据。

我有一个包含大量列的表,如果我调用Find()方法,它将返回该行的所有列,但我只想使用,例如,来自2列的数据。

MyTable table = context.MyTable.Find(id); //Get MyTable object from context, id = primary key
string p1 = table.Prop1;
string p2 = table.Prop2;

这将返回单个对象,其中所有(例如,它具有Prop1,Prop2,...,PropN)属性已填充(如果填充在数据库中)。 所以我知道我可以使用匿名对象或数据传输对象(DTO),但[问题1]是否还有其他(但简单)方法来获取特定列? [问题2]如果我使用Find()(或者我应该使用Where()/Select()),它会影响效果吗?

3 个答案:

答案 0 :(得分:3)

    var items = context.MyTable.Where(x => x.Id == id)
                  .Select(x => new
                               {
                                    P1 = table.Prop1,
                                    P2 = table.Prop2
                               });

这将转换为sql调用,如:

SELECT p.Prop1, p.Prop2 FROM mytable p WHERE p.Id = id

答案 1 :(得分:2)

使用数据传输对象:DTO,这是推荐的微软模式。

简单来说,它们只是保存数据的对象。

然后像建议的那样做:

public class MyDto
{
  public string Prop1 {get;set;} = String.Empty
  public string Prop2 {get;set;} = String.Empty
}
MyDto x = new MyDto();
 x = context.MyTable.Where(x => x.Id == id)
                  .Select(x => new MyDto
                               {
                                    P1 = table.Prop1
//I don't want prop 2, for example
                               });

绕过物体。设置自动属性(C# 6及更高版本)的默认值,并仅初始化所需的属性。

编辑: 我读过你不想使用匿名和DTO,然后你想怎么做。您可以使用对象或匿名。

其他方法只是构建一个分层结构,并在您需要的地方直接调用查询方法。模式存在是有原因的。

您可以针对Dynamic objects致电查询。通过这些,您可以分配将在运行时解析的字段,但代价是失去强类型。

您可能还想检查它的性能是否使用动力学。

答案 2 :(得分:-2)

一种简单的方法是指定匿名类型。只需将匿名类型视为一种将数据放入对象而不定义对象的方法。我们可以通过使用“new”运算符并从我们需要的对象中选择属性来简单地做到这一点。

using (var context = new StackOverflowContext())
{
                    var posts = context.Posts
                   .Where(p => p.Tags == "<sql-server>")
                   .Select(p => new {p.Id, p.Title});

}