Я внес некоторые изменения, чтобы добавить поле в таблицу, и теперь я получаю исключение при приведении.
Я максимально сузил код и все еще получаю сообщение об ошибке.
Мои изменения были полностью удалены, и я все еще получаю проблему.
Один вопрос: если он действительно относится к типу ClientService, как он заявляет в исключении, как он может иметь проблему с приведением к IClientID? Я вижу только примитивные типы.
В этом коде
try {
using (CFDb db = CreateDbContext<CFDb>(context)) {
ServiceFilter serviceFilter = filters.Where(f => f.ClassName == "ServiceFilter").Select(f => f).FirstOrDefault() as ServiceFilter;
IQueryable<ClientService> query = BuildServiceFilter(serviceFilter, db);
query = BuildClientGovernmentAssistanceFilter(query, (ClientGovernmentAssistanceFilter)null, db);
ClientService[] result = query.ToArray();
}
} catch (Exception ex) {
Logger.LogException("GetServicesReportData", ex, System.Diagnostics.TraceEventType.Error);
return null;
}
query.ToArray () выдает
System.NotSupportedException: невозможно привести тип «Shared.ClientService» к типу «Shared.IClientID». LINQ to Entities поддерживает только приведение типов примитивов и перечислений EDM.
BuildClientGo GovernmentAssistanceFilter выглядит так
private IQueryable<T> BuildClientGovernmentAssistanceFilter<T>(IQueryable<T> query, ClientGovernmentAssistanceFilter filter, CFPINDb db) where T : IClientID {
query = from clientService in query
join clientGovernmentAssistance in db.ClientGovernmentAssistance on clientService.ClientID equals clientGovernmentAssistance.ClientID
select clientService;
return query;
}
Если я закомментирую соединение или вызов подпрограммы, ошибка исчезнет.
Я не думаю, что это проблема с объединенной таблицей как таковой, потому что я могу заменить любую другую таблицу, которая поддерживает IClientID, и получить ту же ошибку.
Обратите внимание, что T здесь IClientID и называется ClientService.
Я могу получить BuildServiceFilter до этого:
private IQueryable<ClientService> BuildServiceFilter(ServiceFilter serviceFilter, CFPINDb db) {
query = from clientService in db.ClientServices
select clientService;
return query;
}
Вот определения:
public interface IClientID {
int ClientID { get; set; }
}
[DataContract]
public class ClientService : IClientID {
[DataMember]
public int ClientID { get; set; }
[DataMember]
public int ServiceID { get; set; }
[DataMember]
public DateTime ServiceDate { get; set; }
}
ClientService немного изменен:
public DbSet<ClientService> ClientServices { get; set; }
modelBuilder.Entity<ClientService>().HasKey(k => new { k.ClientID, k.ServiceID, k.ServiceDate });
modelBuilder.Entity<ClientService>().Property(p => p.ClientID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
modelBuilder.Entity<ClientService>().Property(p => p.ClientID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
[DataContract]
public class ClientGovernmentAssistance: IClientID {
[DataMember, Key]
public int ClientGovernmentAssistanceID { get; set; }
[DataMember]
public int ClientID { get; set; }
}
Вроде бы что-то с соединением, а не с самими элементами таблицы, но я не могу понять, что.
Если я извлекаю код и вставляю функции в строку, это приводит к другой ошибке при приведении анонимного типа, что имеет еще меньший смысл.