【问题标题】:How do omit a column(s) from the results of a LINQ query using Entity Framework 5如何使用 Entity Framework 5 从 LINQ 查询的结果中省略列
【发布时间】:2014-02-04 04:13:47
【问题描述】:

我将图像数据存储在数据库中。除了图像数据之外,还有一些字段包括元信息(图像大小、描述、名称等)。我只想返回图像的元信息,而不是实际的图像字节数据本身。我希望有一种方法可以返回除图像数据之外的所有字段,而无需 select each column individually into an anonymous object。我使用的是 Entity Framework 5.0 和 Code First,所以没有设计师或 EDMX 或任何东西。

我看到了这篇文章 ...selecting-all-but-one-property-using-linq-entity-framework ...但答案集中在使用设计器的解决方案上,我的代码都是代码优先,没有设计器参与。此外,当我对“推迟”单个列进行搜索时,我被定向到 MS 站点上的 page,该站点处理推迟加载类而不是单个字段,此外它说它的信息已过时(大概 5.0 确实不一样吗?)。

一如既往,任何帮助都会得到高度赞赏和焚香和诵经仪式的回报。谢谢!!

【问题讨论】:

  • 您可以创建一个仅包含图像数据的新表,并将它们与相同的主键链接。然后你的属性变成了一个导航属性,它可以被延迟加载。
  • 链接的问题就是这么说的。
  • @Wiktor 抱歉,我们发布得太近了,我没有看到你的链接。

标签: c# linq-to-entities entity-framework-5


【解决方案1】:

下面创建了一个表,但允许对您可能并不总是希望加载的字段(在本例中,一个名为 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]

【讨论】:

  • 感谢您提供的详细信息。我认为这种方法比实际拆分表并不得不处理更多关系更可取。
猜你喜欢
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
相关资源
最近更新 更多