C# 如何使用EntityFramework 5从LINQ查询结果中省略列

C# 如何使用EntityFramework 5从LINQ查询结果中省略列,c#,linq-to-entities,entity-framework-5,C#,Linq To Entities,Entity Framework 5,我将图像数据存储在数据库中。除图像数据外,还有包含元信息(图像大小、描述、名称等)的字段。我只想返回图像的元信息,而不是实际的图像字节数据本身。我希望有一种方法可以返回除图像数据之外的所有字段,而无需进行任何操作。我首先使用的是EntityFramework5.0和代码,所以没有设计师或EDMX之类的东西 我看到这个帖子。。。但是答案是集中在使用设计器的解决方案上,我的代码都是代码优先,没有涉及设计器。另外,当我搜索“延迟”单个列时,我被引导到一个MS站点,该站点处理延迟加载类而不是单个字段的问

我将图像数据存储在数据库中。除图像数据外,还有包含元信息(图像大小、描述、名称等)的字段。我只想返回图像的元信息,而不是实际的图像字节数据本身。我希望有一种方法可以返回除图像数据之外的所有字段,而无需进行任何操作。我首先使用的是EntityFramework5.0和代码,所以没有设计师或EDMX之类的东西

我看到这个帖子。。。但是答案是集中在使用设计器的解决方案上,我的代码都是代码优先,没有涉及设计器。另外,当我搜索“延迟”单个列时,我被引导到一个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();
    }

下面创建了一个表,但允许引用/导航属性到您可能并不总是希望加载的字段(在本例中,是一个名为
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();
    }

下面创建了一个表,但允许引用/导航属性到您可能并不总是希望加载的字段(在本例中,是一个名为
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();
    }

下面创建了一个表,但允许引用/导航属性到您可能并不总是希望加载的字段(在本例中,是一个名为
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();
    }

您可以创建一个只包含图像数据的新表,并使用相同的主键链接它们。然后,您的属性成为导航属性,可以延迟加载。这就是链接问题所说的。@Wiktor很抱歉,我们贴得太近,以至于我没有看到您的链接。您的可能副本可以创建一个只包含图像数据的新表,并使用相同的主键链接它们。然后,您的属性成为导航属性,可以延迟加载。这就是链接问题所说的。@Wiktor很抱歉,我们贴得太近,以至于我没有看到您的链接。您的可能副本可以创建一个只包含图像数据的新表,并使用相同的主键链接它们。然后,您的属性成为导航属性,可以延迟加载。这就是链接问题所说的。@Wiktor很抱歉,我们贴得太近,以至于我没有看到您的链接。您的可能副本可以创建一个只包含图像数据的新表,并使用相同的主键链接它们。然后,您的属性成为导航属性,可以延迟加载。这就是链接问题所说的。@Wiktor很抱歉我们贴得太近,以至于我没有看到您的链接。谢谢您提供的详细信息。我认为这种方法比实际拆分表和管理更多关系更可取。谢谢您提供的详细信息。我认为这种方法比实际拆分表和管理更多关系更可取。谢谢您提供的详细信息。我认为这种方法比实际拆分表和管理更多关系更可取。谢谢您提供的详细信息。我认为这种方法比实际拆分表和管理更多关系更可取。