我保证所有这些例子都会带来一些连贯点,随意浏览,直到最后(甚至可能是那时)它的基本内容:
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)并试图避免在表中放置冗余信息,例如表名。我可能会遗漏一些明显的东西。
答案 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; }
}