通过EF从表中选择时,是否可以为输出分配新属性?

时间:2015-08-28 03:28:58

标签: c# linq entity-framework

我保证所有这些例子都会带来一些连贯点,随意浏览,直到最后(甚至可能是那时)它的基本内容:

public class Sample //let's say this is also a DbSet model from which EF creates a SQL tbl
{
    public long Id{ get; set; }
    public string Name{ get; set; }
}

我可以从那个表中选择:

var samples =
    from sample in myDb.Samples
    select new //anonymoys type
    {
        Id = sample.Id,
        Name = sample.Name 
    };

var samples =
    from sample in myDb.Samples
    select new Sample  //not anonymous - I don't really know what the difference is, w/e
    {
        Id = sample.Id,
        Name = sample.Name 
    };

但是,如果我想选择DbSet模型的属性(/表中的列)并添加一些自定义数据,例如:

var samples =
    from sample in myDb.Samples
    select new 
    {
        Id = sample.Id,
        Name = sample.Name 
        TableName = 'Samples'
    };

我已经尝试过上面的代码,但是,我以后无法编辑" TableName" - 给出了一个错误,指出它是只读的。然后我制作了一个新模型" SampleViewModel"并给它一个TableName属性,但是它创建了以下异常:

  

类型' System.NotSupportedException'的第一次机会异常。发生在EntityFramework.SqlServer.dll

希望这很清楚,并解释我在标题中提出的问题。如果有人好奇,我在实践中正在做的是在5个表中创建一个联合(EF中的.concat)并试图避免在表中放置冗余信息,例如表名。我可能会遗漏一些明显的东西。

1 个答案:

答案 0 :(得分:1)

匿名类具有只读属性。 AFAIK,它不容易投射到具有初始化属性的可编辑匿名类型。

但是,您应该能够投射到您已定义的自定义类型,但请注意,这样做可以减少您的注意力。可以这么说:在那之后,你不再在SQL领域了,而且它全都在记忆中。如果你从那里做任何where条件,它将在客户端完成,这意味着所有候选人都将被拉到客户端。也就是说,要做到这一点,你可以这样做:

var samples =
from sample in myDb.Samples
select new CustomClass
{
    Id = sample.Id,
    Name = sample.Name 
    TableName = "Samples"
};

CustomClass看起来像这样:

public class CustomClass
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string TableName { get; set; }
}