【发布时间】:2014-03-11 08:45:11
【问题描述】:
当EntityFramework 执行LINQ 查询时,如果查询以动态类的形式返回某些内容,我无法获得真实类型的结果。
我有一个抽象类:
abstract class Person
{
public string Name { get; set; }
//and about 1000 other properties
}
还有 2 个派生类:
class RealPerson : Person
{
public void Print()
{
Console.WriteLine("Type=RealPerson, Name=" + Name);
}
}
class LegalPerson : Person
{
public void Print()
{
Console.WriteLine("Type=LegalPerson, Name=" + Name);
}
}
我的LINQ TO SQL查询:
var lst =
EFContext.Persons.Select(item=> new { DynamicClass_Name = item.Name }).ToList();
现在对于 lst 中的每个项目,我需要知道其类的类型才能将该项目转换为该类型,但 item.GetType() 返回一个动态类型。
例如,假设 lst 的一项是RealPerson(称为dynamicTypeItem),所以如果我知道它的类型是RealPerson,我将使用此代码将此dynamicTypeItem 转换为RealPerson:
var value = dynamicTypeItem.GetType().GetProperty("DynamicClass_Name").GetValue(dynamicTypeItem);
var result = (RealPerson)Activator.CreateInstance(typeof(RealPerson));
result.GetType().GetProperty("Name").SetValue(result, value);
但我不知道这个 dynamicTypeItem 的类型(它有一个动态类型); 如何实现lst每一项的类型? 上述查询仅选择实体的 1 个属性(名称属性)非常重要,因此我不能使用此代码:
var lst =
EFContext.Persons.ToList().Select(item=> new { DynamicClass_Name = item.Name, Type=item.GetType() });
所以我需要知道 lst 的每个项目的类型,然后再将这个项目转换为动态类型。
EDIT1
更多解释:结果不能是Person,因为Person 是抽象的。结果是RealPerson 或LegalPerson,当我在将强类型转换为匿名类型期间仅选择RealPerson 或LegalPerson 的属性之一时,会丢失原始实体的类型。
【问题讨论】:
-
动态类型是什么意思?动态类型 ==
dynamic关键字? -
你好,其实它还是强类型,你在查询中使用匿名类型,如果你使用Visual Studio,你只需要在选择上,那么它应该你的结果类型。
-
@findeberg 正如 Panada Zhang 提到的,在这个问题中动态类型的平均值是匿名类型。此表达式在编译时创建一个名为“匿名”的新类型:item=> new { DynamicClass_Name = item.Name }
-
这个匿名类型只有一个属性(DynamicClass_Name)
-
您使用的是 Linq to SQL 还是实体框架?为什么你甚至需要演员,你有一个适合所有人的二传手。为什么@#$% 你投射你的查询?您似乎完全错过了 ORM 的要点。
标签: c# linq entity-framework