【发布时间】:2008-12-18 15:18:46
【问题描述】:
在对枚举类型进行操作时,我在 LINQ 查询上使用 OrderBy 扩展方法时遇到了一些问题。我使用 Visual Studio 创建了一个常规的 DataContext,只需将所有内容拖放到设计器上即可。然后,我创建了单独的实体模型,它们只是 POCO,我使用存储库模式从我的数据库中获取数据并将它们映射到我自己的实体模型中(或者更确切地说,我有一个存储库模式,它可以构建和 IQueryable这将完成所有这些)。
一切正常,除非我尝试在我已从 short/smallint 映射到枚举的属性上应用 OrderBy(存储库外部)。
以下是相关代码位:
public class Campaign
{
public long Id { get; set; }
public string Name { get; set; }
....
public CampaignStatus Status { get; set; }
...
}
public enum CampaignStatus : short {
Active,
Inactive,
Todo,
Hidden
}
public class SqlCampaignRepository : ICampaignRepository
{
...
public IQueryable<Campaign> Campaigns()
{
DataContext db = new DataContext();
return from c in db.Campaigns
select new Campaign
{
Id = c.Id,
Name = c.Name,
...
Status = (CampaignStatus)c.Status,
...
};
}
}
然后在别处
SqlCampaignRepository rep = new SqlCampaignRepository();
var query = rep.Campaigns().OrderBy(c => c.Status);
这会触发以下异常: System.ArgumentException 未被用户代码处理 Message="参数 'value' 的类型错误。应为 'IQMedia.Models.CampaignType'。实际为 'System.Int16'。" 源="系统.Data.Linq" 堆栈跟踪: ved System.Data.Linq.SqlClient.SqlOrderExpression.set_Expression(SqlExpression 值) 已验证 System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitSelect(SqlSelect 选择) ved System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode 节点) 已验证 System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitIncludeScope(SqlIncludeScope 范围) ...
(对不起里面的丹麦语,ved = by/at)。
我已经尝试在 orderBy 表达式中将 Status 类型转换为 short,但这并没有帮助,如果我也将它转换为实际的 enum 类型也是如此。
非常感谢任何解决此问题的帮助!
【问题讨论】:
标签: c# linq-to-sql enums