C# Linq到SQL OrderBy,使用枚举时发出

C# Linq到SQL OrderBy,使用枚举时发出,c#,linq-to-sql,enums,C#,Linq To Sql,Enums,当LINQ查询在枚举类型上运行时,我在LINQ查询上使用OrderBy扩展方法时遇到一些问题。我使用VisualStudio创建了一个常规的DataContext,只需将所有内容拖放到设计器中即可。然后,我创建了单独的实体模型,它们只是POCO,我使用了一个存储库模式从数据库中获取数据,并将它们映射到我自己的实体模型中,或者更确切地说,我有一个存储库模式,它可以构建和IQueryable来完成所有这些 除了尝试在存储库外部对已从short/smallint映射到enum的属性应用OrderBy外

当LINQ查询在枚举类型上运行时,我在LINQ查询上使用OrderBy扩展方法时遇到一些问题。我使用VisualStudio创建了一个常规的DataContext,只需将所有内容拖放到设计器中即可。然后,我创建了单独的实体模型,它们只是POCO,我使用了一个存储库模式从数据库中获取数据,并将它们映射到我自己的实体模型中,或者更确切地说,我有一个存储库模式,它可以构建和IQueryable来完成所有这些

除了尝试在存储库外部对已从short/smallint映射到enum的属性应用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,
                       ...
                   };
     }
}
这会触发以下异常: 用户代码未处理System.ArgumentException Message=参数“value”的类型错误。应为“IQMedia.Models.CampaignType”。实际“System.Int16”。 Source=System.Data.Linq 堆栈跟踪: ved System.Data.Linq.SqlClient.SqlOrderExpression.set_ExpressionSqlExpression值 ved System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitSelectSqlSelect ved System.Data.Linq.SqlClient.SqlVisitor.VisitSqlNode节点 ved System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitIncludeScopeSqlIncludeScope范围

对不起,里面有丹麦人,ved=by/at

我已经尝试在orderBy表达式中将Status转换为short,但这并没有帮助,如果我也将其转换为实际的枚举类型,也是如此


非常感谢您的帮助

活动类和活动之间的关系是什么?如果活动返回活动对象集,请注意,通常无法选择新的映射实体

我想知道如果您在选择之前完成订购是否会更好

最后一个技巧可能是使用平凡的TSQL创建一个伪可组合的[函数]。例如,ABS可能就足够了。i、 e.类似于上下文:

    [Function(Name="ABS", IsComposable=true)] 
    public int Abs(int value) 
    { // to prove not used by our C# code... 
        throw new NotImplementedException(); 
    }
然后尝试:

  .OrderBy(x => ctx.Abs(x.Status))
我还没有测试过上面的内容,但可以稍后再试。。。不过,它也适用于其他一些类似的情况


值得一试

我的DataContext有自己的实体类,名为Campaign,当然,它位于不同的名称空间中。此外,状态列在数据库中另存为smallint,并且LINQ实体名称空间将其类型列为short System.Int16

如果我将orderby应用到我的存储库中的查询中,它确实会起作用——不过这是一个更大的问题的一部分,整个想法是不让存储库应用任何排序、过滤或类似的东西,而只是将数据库实体类映射到我自己的实体类。这个例子显然有点毫无意义,它几乎是一个直接的映射,但在某些情况下,我也加入了本地化

另外,我忘了添加-在我尝试执行查询(即调用ToList或枚举集合)之前,异常显然不会发生

从更大的角度来看,服务类正在使用这种方法,然后服务类应该添加过滤、排序和所有这些——当然,所有这些的要点是将事情分开一点,但也允许轻松过渡到不同的数据库,或不同的or/M,如果这是需要的话

直到我回答之后,我才看到最后一点-我还没有使用Function属性的任何经验,但我将无法访问我应该应用排序的类中的datacontext。

您可以通过设计器直接在datacontext中指定类型ActivationStatus吗?这样,值会自动映射到枚举

  .OrderBy(x => ctx.Abs(x.Status))