我有一个关于使用实体框架从表中选择特定列的问题。问题是,我使用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()
),它会影响效果吗?
答案 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});
}