我有一个Linq查询,我在其中执行以下操作:
query = context.Select(a => new
{
Course = (CourseType)a.CourseCode,
CourseDetail = sting.Format("Course: {0}\r\nCourse Detail: {1}", ((CourseType)a.CourseCode).ToString(), a.CourseDetail)
});
enum CourseType{
Unknown = 0,
FullTime = 1,
PartTime = 2
}
a.CourseCode是一个int而a.CourseDetail是一个字符串。 我现在将网格中的标签绑定到此查询。我将文本设置为<%#Eval(“Course”)%>并且工具提示为<%#Eval(“CourseDetail”)%>。 虽然标签中的文本正确显示了Enum.ToString()的预期值,但Tootip始终将枚举的整数值显示为1,2,3 ...
造成这种情况的原因是什么?
亲切的问候,
答案 0 :(得分:1)
您确定这是您正在使用的确切代码吗?
有一个拼写错误:sting.Format而不是st r ing.Format,所以我猜你已经重新输入了这个问题的代码。检查以确保所有支架都在正确的位置等。
我已经尝试了以下代码,打印出“Fulltime”,因此.ToString方法应该按照您的预期工作:
class Program
{
enum CourseType
{
Unknown = 0,
Fulltime = 1,
Parttime = 2
}
static void Main(string[] args)
{
var i = 1;
Console.WriteLine("Coursetype: {0}", ((CourseType)i).ToString());
}
}
答案 1 :(得分:1)
我认为这是一个错误(或功能)LINQ to SQL。我猜它会重写
query = context.Select(a => new
{
Course = (CourseType)a.CourseCode,
CourseDetail = sting.Format("Course: {0}\r\nCourse Detail: {1}",
((CourseType)a.CourseCode).ToString(), a.CourseDetail)
});
到
query = context.Select(a => new
{
Course = (CourseType)a.CourseCode,
CourseDetail = sting.Format("Course: {0}\r\nCourse Detail: {1}",
a.CourseCode.ToString(), a.CourseDetail)
});
因为enum是数据库中的int,所以这是等价的,对吧? (错。)
解决这个问题的一种方法是使用
将ToString()放在Framework的手中,而不是LINQ to SQL。query = context.Select(a => new
{
Course = (CourseType)a.CourseCode,
CourseDetail = a.CourseDetail
}.ToArray() // get LINQ to SQL out of the way
.Select(a => new
{
Course = a.Course,
CourseDetail = sting.Format("Course: {0}\r\nCourse Detail: {1}",
a.Course, a.CourseDetail)
});
答案 2 :(得分:0)
不是直接答案,而只是一个问题,为什么要打字:
((CourseType)i).ToString()
((CourseType)a.CourseCode).ToString()
string.Format将对象作为ParamArray并在每个对象上调用.ToString()。您使用的附加.ToString()只执行不需要的新字符串的创建。
答案 3 :(得分:0)
你实际上在那里设置正确的值吗?我只是问,因为你的enum CourseTypes最多只能达到2,但是你说:
Tootip总是将枚举的整数值的值显示为1,2,3 ...
在您的代码中,您有:
Course = (CourseType)a.CourseCode,
CourseDetail = sting.Format("Course: {0}\r\nCourse Detail: {1}", ((CourseType)a.CourseCode).ToString(), a.CourseDetail)
您似乎正在尝试将课程代码解析为课程类型(这可能只是表明参数名称选择不当),但可能在哪里你的问题在于。
如果我有:
var Course = (CourseType)3;
这将编译得很好,即使enum只有2,但是当我调用.ToString()时,我只会得到“3”。
答案 4 :(得分:0)
我在使用LINQ时遇到了我认为同样的问题。以下代码始终返回OfferType枚举的数字表示。
public enum OfferType
{
Unknown,
Dining,
Shopping,
etc...
}
return (from so in db.Offers
where so.Status == status
select new
{
so.Headline,
so.BusinessName,
OfferType = ((OfferType) so.OfferTypeId).ToString(),
ExpirationDate = so.ExpirationDate.ToShortDateString(),
StartDate = so.StartDate.ToShortDateString(),
}).ToList();
在第
行OfferType = ((OfferType) so.OfferTypeId).ToString(),
OfferType始终是枚举值的数字表示,而不是预期的字符串表示。 so.OfferTypeId的值是正确的。将行更改为
OfferType = ((OfferType) 1).ToString(),
将返回枚举的预期字符串表示形式。
我必须将演员和ToString移动到另一个方法才能使它工作。
OfferType = GetOfferType(so.OfferTypeId),
...
public static string GetOfferType(int id)
{
return ((OfferType) id).ToString();
}
答案 5 :(得分:0)
静态Enum.GetName()
方法用于获取给定枚举值的常量名称。尝试在课程明细行中调用Enum.GetName(typeof(CourseType), a.CourseCode)
,如下所示:
CourseDetail = String.Format("Course: {0}\r\nCourse Detail: {1}", Enum.GetName(typeof(CourseType), a.CourseCode), a.CourseDetail)