Что не так с этим LINQ - PullRequest
       2

Что не так с этим LINQ

1 голос
/ 18 сентября 2010

У меня есть простое DTO, которое я пытаюсь вернуть через RIAServices, и я продолжаю получать эту ошибку: «Операция загрузки не выполнена для запроса. Невозможно создать постоянное значение типа« System.Object ». Вэтот контекст.

Вот метод запроса:

public IQueryable<SupportDbDTO> GetDbsRelatedToModel(string modelDtoId)
{
    IQueryable<SupportDb> query; 

    var key = new Guid(modelDtoId);
    var siteId = _context.SupportDbs.Single(db => db.Id.Equals(key)).SiteDbId ?? Guid.Empty;

    query = _context.SupportDbs
       .Where(db => !db.Id.Equals(key))
       .Where(db => db.DBType == DB.CATALOG_DB || db.DBType == DB.CATALOG_SCHEMA_DB || db.DBType == DB.MODEL_DB)
       .Where(db => db.SiteDbId.Equals(siteId))
       .OrderBy(db => db.DBName);

    return query.AsEnumerable()
        .Select(db => new SupportDbDTO
        {
         Id = db.Id.ToString(),
         DBName = db.DBName,
         DBType = db.DBType,
         PlantRoot = db.PlantRoot,
         DBSize = db.DBSize ?? 0,
         ModifiedDate = db.ModifiedDate ?? DateTime.Now       
        }).AsQueryable();
}

Я получил его на работу, используя == вместо Equals. Это был оскорбительный:

query = _context.SupportDbs
    .Where(db => db.Id != key)
    .Where(db => db.DBType == DB.CATALOG_DB || db.DBType == DB.CATALOG_SCHEMA_DB || db.DBType == DB.MODEL_DB)
    .Where(db => db.SiteDbId == siteId)
    .OrderBy(db => db.DBName);

Ответы [ 2 ]

1 голос
/ 18 сентября 2010

Я полагаю, вы используете Entity Framework?Поставщик LINQ для Entity Framework собирается принять ваш запрос LINQ и напрямую преобразовать его в SQL.LINQ to SQL, вероятно, делает то же самое, но я никогда не использовал его.

Так что провайдер EF LINQ не знает, как превратить Object.Equals() в кусок SQL.

Самый простой ответ - сделать то, что вы уже делаете в других местах, преобразовать запрос в перечисляемый с AsEnumerable(), и с этого момента он перестанет быть запросом EF, а запросом LINQ to Objectsи теперь весь LINQ будет работать за счет необходимости извлекать весь запрос из базы данных в память.

Но в данном конкретном случае простое использование == выглядит так, как будто оно вам помогло.

0 голосов
/ 18 сентября 2010
  1. Проверьте, поддерживает ли SupportDbDTO сериализуемый
  2. вместо возврата IQuerable возвращает массив (SupportDbDTO [])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...