如何使用实体框架 5 从 LINQ 查询的结果中省略列
本文关键字:结果 中省 查询 LINQ 实体 何使用 框架 | 更新日期: 2023-09-27 18:36:00
我把图像数据存储在数据库中。除了图像数据之外,还有一些字段包括元信息(image_size、描述、名称等)。我只想返回图像的元信息,而不是实际的图像字节数据本身。我希望有一种方法可以返回除图像数据以外的所有字段,而不必将每一列单独选择到匿名对象中。我使用的是实体框架 5.0 和代码优先,所以没有设计师或 EDMX 或任何东西。
我看到了这篇文章...选择除一个属性之外的所有属性使用linq实体框架...但是答案集中在使用设计器的解决方案上,我的代码都是代码优先,不涉及设计器。此外,当我搜索"延迟"单个列时,我被定向到 MS 网站上的一个页面,该页面处理延迟加载类而不是单个字段,此外它还说它的信息已过时(大概 5.0 有所不同?
与往常一样,任何帮助都会得到很多赞赏和香火和诵经仪式的回报。谢谢!!
下面创建了一个表,但允许引用/导航属性到您可能并不总是希望加载的字段(在本例中为名为 Data
的字节数组)。 这称为表拆分。
关键说明是使用 TableAnnotion
将两个实体映射到同一个表 (duh),并共享相同的主键,该主键用作彼此导航属性的外键。
[Table("Document")]
public class Document
{
[Key]
[ForeignKey("Data")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int DocumentId { get; set; }
public string FileName { get; set; }
public DateTime Created { get; set; }
public virtual DocumentData Data { get; set; }
}
[Table("Document")]
public class DocumentData
{
[Key]
[ForeignKey("Document")]
public int DocumentId { get; set; }
public byte[] Data { get; set; }
public virtual Document Document { get; set; }
}
public class DocEntities : DbContext
{
public DocEntities()
: base("name=TestEntitiesCodeFirst")
{
}
public DbSet<Document> Documents { get; set; }
}
static void Main(string[] args)
{
using (var db = new InheritTest.DocEntities())
{
var doc = new Document()
{
Created = DateTime.Now,
FileName = "Abc.txt",
Data = new DocumentData()
{
Data = new byte[] { 0x50, 0x51, 0x52, 0x53 }
}
};
db.Documents.Add(doc);
db.SaveChanges();
}
using (var db = new InheritTest.DocEntities())
{
db.Configuration.LazyLoadingEnabled = false;
var doc = db.Documents.First();
if (doc.Data == null)
{
Console.WriteLine("doc.Data is null");
}
db.Entry(doc).Reference(p => p.Data).Load();
if (doc.Data != null)
{
Console.WriteLine("doc.Data is not null");
Console.WriteLine(doc.Data.Data.Length);
}
}
var input = Console.ReadLine();
}
结果表:
CREATE TABLE [dbo].[Document](
[DocumentId] [int] IDENTITY(1,1) NOT NULL,
[FileName] [nvarchar](max) NULL,
[Created] [datetime] NOT NULL,
[Data] [varbinary](max) NULL,
CONSTRAINT [PK_dbo.Document] PRIMARY KEY CLUSTERED
(
[DocumentId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]