我想使用 LINQ 查询返回以整数形式存储在数据库中的枚举的字符串值。
我尝试过的:
return (from a in context.Tasks
select new TaskSearch
{
TaskID = a.TaskID,
TaskTypeName = Enum.GetName(typeof(TaskTypeEnum), a.TaskType)
}).ToList();
我正在使用 asp.net mvc。
异常: EntityFramework.SqlServer.dll 中发生“System.NotSupportedException”类型的异常,但未在用户代码中处理
其他信息:LINQ to Entities 无法识别“System.String GetName(System.Type, System.Object)”方法,并且此方法无法转换为存储表达式。
你需要具体化你的查询(查询必须能够转换为sql语句,但是
Enum.GetName()
不能转换为sql)
尝试
((from a in context.Tasks select a).AsEnumerable().Select(t => new TaskSearch
{
TaskID = t.TaskID,
TaskTypeName = Enum.GetName(typeof(TaskTypeEnum), t.TaskType)
}).ToList());
我定义了一组这样的枚举扩展,我发现它很有用。不幸的是,类型约束无法细化到
struct
之外,因此您必须从外部确保仅在枚举上调用这些方法。:
/// <summary>Type-safe extension methods for parsing Enums.</summary>
public static partial class EnumExtensions{
#region Enum Parsing utilities
/// <summary>Typesafe wrapper for <c>Enum.GetValues(typeof(TEnum).</c></summary>
public static ReadOnlyCollection<TEnum> EnumGetValues<TEnum>() {
return new ReadOnlyCollection<TEnum>((TEnum[])(Enum.GetValues(typeof(TEnum))));
}
/// <summary>TODO</summary>
[SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter")]
public static ReadOnlyCollection<string> EnumGetNames<TEnum>() where TEnum : struct {
return new ReadOnlyCollection<string>((string[])(Enum.GetNames(typeof(TEnum))));
}
/// <summary>Typesafe wrapper for <c>Enum.ParseEnum()</c> that automatically checks
/// constants for membership in the <c>enum</c>.</summary>
public static TEnum ParseEnum<TEnum>(string value) where TEnum : struct {
return ParseEnum<TEnum>(value,true);
}
/// <summary>Typesafe wrapper for <c>Enum.ParseEnum()</c> that automatically checks
/// constants for membership in the <c>enum</c>.</summary>
public static TEnum ParseEnum<TEnum>(string value, bool checkConstants) where TEnum : struct {
TEnum enumValue;
if (!TryParseEnum<TEnum>(value, out enumValue) && checkConstants)
throw new ArgumentOutOfRangeException("value",value,"Enum type: " + typeof(TEnum).Name);
return enumValue;
}
/// <summary>Typesafe wrapper for <c>Enum.TryParseEnum()</c> that automatically checks
/// constants for membership in the <c>enum</c>.</summary>
public static bool TryParseEnum<TEnum>(string value, out TEnum enumValue) where TEnum : struct {
return Enum.TryParse<TEnum>(value, out enumValue)
&& Enum.IsDefined(typeof(TEnum),enumValue);
}
/// <summary>Typesafe wrapper for <c>Enum.ToObject()</c>.</summary>
/// <typeparam name="TEnum"></typeparam>
public static TEnum EnumParse<TEnum>(char c, string lookup) {
if (lookup==null) throw new ArgumentNullException("lookup");
var index = lookup.IndexOf(c);
if (index == -1) throw new ArgumentOutOfRangeException("c",c,"Enum Type: " + typeof(TEnum).Name);
return (TEnum) Enum.ToObject(typeof(TEnum), index);
}
#endregion
}
您的错误表明查询无法理解 Enum.GetName() 方法。您只需对整数进行类型转换即可解决此问题 查询中的值。
尝试
((from a in context.Tasks select a).AsEnumerable().Select(t => new
TaskSearch
{
TaskID = t.TaskID,
TaskTypeName = (TaskTypeEnum)t.TaskType
}).ToList());