Невозможно привести тип Shared.ClientService к типу Shared.IClientID. LINQ to Entities поддерживает только приведение типов примитивов и перечислений EDM - PullRequest
1 голос
/ 16 апреля 2019

Я внес некоторые изменения, чтобы добавить поле в таблицу, и теперь я получаю исключение при приведении.
Я максимально сузил код и все еще получаю сообщение об ошибке.
Мои изменения были полностью удалены, и я все еще получаю проблему.

Один вопрос: если он действительно относится к типу 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; }
}

Вроде бы что-то с соединением, а не с самими элементами таблицы, но я не могу понять, что.

Если я извлекаю код и вставляю функции в строку, это приводит к другой ошибке при приведении анонимного типа, что имеет еще меньший смысл.

1 Ответ

0 голосов
/ 17 апреля 2019

Решение, как указал Clay, заключалось в том, чтобы добавить 'class' ко всем объявлениям функции IQueryable<T>.

    private IQueryable<T> ... where T : class, IClientID

Я не думал, что это сработает, поскольку выглядело, как будто все случаи, когда я видел, что решение «класс» шло в другом направлении, пытаясь привести интерфейс к классу, тогда как моей ошибкой было приведение класса к интерфейс. Похоже, это работает в обе стороны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...