У меня возникли проблемы с использованием метода расширения OrderBy в запросе LINQ, когда он работает с типом enum. Я создал обычный DataContext с использованием Visual Studio, просто перетаскивая все на дизайнера. Затем я создал отдельные модели сущностей, которые являются просто POCO, и я использовал шаблон хранилища для извлечения данных из моей базы данных и сопоставления их с моими собственными моделями сущностей (точнее, у меня есть шаблон хранилища, который накапливается и IQueryable это все сделает).
Все работает просто отлично, за исключением случаев, когда я пытаюсь применить OrderBy (вне репозитория) к свойству, которое я сопоставил от short / smallint для перечисления.
Вот соответствующие биты кода:
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 не был обработан кодом пользователя
Сообщение = «Аргумент« значение »был неправильного типа. Ожидаемый« IQMedia.Models.CampaignType ». Фактический« System.Int16 »."
Источник = "System.Data.Linq"
Трассировки стека:
ved System.Data.Linq.SqlClient.SqlOrderExpression.set_Expression (значение SqlExpression)
ved System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitSelect (SqlSelect select)
ved System.Data.Linq.SqlClient.SqlVisitor.Visit (узел SqlNode)
ved System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitIncludeScope (область действия SqlIncludeScope)
...
(извините за датский язык, ved = by / at).
Я попытался вписать Status в short в выражении orderBy, но это не поможет, если я приведу его к фактическому типу enum.
Любая помощь, исправляющая это, очень ценится!