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