Не удается привести системы типа '.Системы типа int64' типа '.Объект". LINQ to Entities поддерживает только типы примитивов модели данных сущности литья
Я создал EF 4 & C# чтобы получить некоторые данные. Я использую Linq. Его следующим образом:
public List<object> GenerateCallTrackingReport(int startRowIndex, int maximumRows, int createdByID)
{
var query = from c in this.ObjectContext.CallLogs
select new
{
CallLogID = c.CallLogID,
DomainName = c.CallDomain.FullName,
CreatedByID = c.CreatedByID,
CreatedBy = c.CreatedByUser.FirstName + " " + c.CreatedByUser.LastAccessIPN,
CalledOn = c.CallDate,
IssueResolutionTime = c.IssueResolutionTime,
CallType = c.CallType.FullName,
CallDescription = c.CallDescription,
CustomerName = (c.CustomerID > 0 ? c.Customer.FirstName + " " + c.Customer.LastAccessIPN : c.TempCaller.FirstName + " " + c.TempCaller.LastName),
CustomerEmail = (c.CustomerID > 0 ? c.Customer.Email : string.Empty),
CustomerResponse = c.Response.FullName,
IsPending = c.IsPending,
NeedFurtherContact = c.NeedFurtherContact
};
if (createdByID > 0)
query = query.Where(c => c.CreatedByID == createdByID);
if (maximumRows > 0)
query = query.Skip(startRowIndex).Take(maximumRows);
return query.ToList<object>();
}
это вызывает следующую ошибку:
Unable to cast the type 'System.Int64' to type 'System.Object'. LINQ to Entities only supports casting Entity Data Model primitive types.
любая идея y я получаю эту ошибку??
спасибо
3 ответов
разрешить
у меня было две проблемы, каждая из них вызовет эту ошибку:
1. Я получал доступ тип nullable свойства сущности без проверки, имеют ли они значение или нет. Скажи CustomerID is тип nullable, поэтому мой запрос стал чем-то вроде этого!
var query = from c in this.ObjectContext.CallLogs
select new
{
CallDescription = c.CallDescription,
CustomerID = c.CustomerID.HasValue ? c.CustomerID.Value : 0,
CustomerName = c.CustomerID.HasValue ? c.Customer.Name : ""
};
if (maximumRows > 0)
query = query.Skip(startRowIndex).Take(maximumRows);
return query.ToList<object>();
поэтому просто проверьте любое нулевое значение его свойство hasvalue свойство перед доступом к нему (2-я строка в select доля.)
2. Я также пытался преобразовать integer в string в инструкции select. Поэтому я просто решил, что преобразование в HTML вместо того, чтобы непосредственно делать это здесь. Это решило мои проблемы.
надеюсь, это поможет кому-то!
после ToList
вызов, который вы хотите выполнить на C#, а не в базе данных. Использовать AsEnumerable
как способ сказать: "прекратите делать это в базе данных, сделайте это на C#."
добавьте это прямо перед ToList
в конце, чтобы все остальное было сделано в базе данных.
во-первых, я бы не извлекал всю таблицу, а затем делал запросы на полный набор данных в C#, как вы делаете здесь. Связывание linq с такими методами сущностей сделает его быстрее-массово, поэтому, когда вы получаете огромные наборы данных:
this.ObjectContext.CallLogs
.Where(c => c.CreatedByID == createdByID)
.Skip(startRowIndex)
.Take(maximumRows)
.Select(new
{
CallLogID = c.CallLogID,
DomainName = c.CallDomain.FullName,
CreatedByID = c.CreatedByID,
CreatedBy = c.CreatedByUser.FirstName + " " + c.CreatedByUser.LastAccessIPN,
CalledOn = c.CallDate,
IssueResolutionTime = c.IssueResolutionTime,
CallType = c.CallType.FullName,
CallDescription = c.CallDescription,
CustomerName = (c.CustomerID > 0 ? c.Customer.FirstName + " " + c.Customer.LastAccessIPN : c.TempCaller.FirstName + " " + c.TempCaller.LastName),
CustomerEmail = (c.CustomerID > 0 ? c.Customer.Email : string.Empty),
CustomerResponse = c.Response.FullName,
IsPending = c.IsPending,
NeedFurtherContact = c.NeedFurtherContact
})
.ToList();
во-вторых, я не знаю точной проблемы, но создание списка динамических объектов, подобных этому, не очень хорошая идея. Создать CallLogModel
класс со свойствами, которые вы помещаете в объект следующим образом:
.Select(new CallLogModel
{
CallLogID = c.CallLogID,
DomainName = c.CallDomain.FullName,
CreatedByID = c.CreatedByID,
CreatedBy = c.CreatedByUser.FirstName + " " + c.CreatedByUser.LastAccessIPN,
CalledOn = c.CallDate,
IssueResolutionTime = c.IssueResolutionTime,
CallType = c.CallType.FullName,
CallDescription = c.CallDescription,
CustomerName = (c.CustomerID > 0 ? c.Customer.FirstName + " " + c.Customer.LastAccessIPN : c.TempCaller.FirstName + " " + c.TempCaller.LastName),
CustomerEmail = (c.CustomerID > 0 ? c.Customer.Email : string.Empty),
CustomerResponse = c.Response.FullName,
IsPending = c.IsPending,
NeedFurtherContact = c.NeedFurtherContact
})