【问题标题】:How to get a subset of columns from a table without requiring a new type in Linq如何在不需要 Linq 中的新类型的情况下从表中获取列的子集
【发布时间】:2015-07-15 11:26:01
【问题描述】:

例如如果我有以下课程:

public class Schema
{
    public int SchemaId { get; set; }
    public byte[] XsdFile { get; set; }
    public byte[] MetadataFile { get; set; }
    public byte[] TemplateFile { get; set; }

    public string Name { get; set; }
}

我在 Linq 中使用这个查询,我会得到所有的列:

from s in db.Schemas select s;

如果我只需要 IdName 列以及其他三字节数组字段的默认值,我需要将其投影到另一个定义的类型或匿名类型或字典,如下所示:

db.Schemas.ToDictionary(s => s.SchemaId, s => s.Name);

但是,我怎样才能获得相同的类型,即Schema 本身与 LINQ 查询将具有这些字节数组的默认值,而不是从表中获取它们?我真的不想创建另一种类型,也不能使用匿名类型,因为我想从 Web 服务中传输它。

【问题讨论】:

    标签: c# mysql linq entity-framework-6


    【解决方案1】:

    将相关部分选择成匿名类型,调用.ToList()将数据带入内存,然后投影到新的Schema对象中。

    var result = (from s in db.Schemas
                 select new { s.SchemaId, s.Name })
                 .ToList()
                 .Select(s => new Schema
                 { 
                     SchemaId = s.SchemaId, 
                     Name = s.Name,
                     XsdFile = new byte[length],
                     MetadataFile = new byte[length],
                     TemplateFile = new byte[length]
                 });
    

    【讨论】:

    • 这将引发异常 - 无法在 LINQ to Entities 查询中构造实体或复杂类型“架构”。
    • @teenup 您在此处提到 LINQ to Entities,在另一个答案中提到 Linq to Sql,是什么?
    • 这是Linq to Sql - 我在问题标题中也提到了from table这个词
    • @teenup,我不知道您不能在查询中创建实体对象,我想我从来没有需要这样做。这似乎在 LinqPad 中有效。
    • @teenup,同样,当您提到from table 时,这并不一定意味着什么。 Linq to SQL 和 Linq to Entities 是不同的。
    【解决方案2】:

    将例程分成两部分。

    首先使用匿名类型

    var tempList= (from s in db.Schemas select new { s.SchemaId , s.Name}).ToList();
    

    然后使用临时 List 来创建 Schema 类型的对象

    var results = (from s in tempList 
                  select new Schema { Schema = s.SchemaId , Name = s.Name }
                  ).ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多