предложение if-else в Linq для запроса структуры объекта - PullRequest
0 голосов
/ 05 января 2012

После запроса Linq to Entities возникает «Невозможно создать постоянное значение типа« Data.InhouseUnit ». В этом контексте поддерживаются только исключительные типы (« Int32, String и Guid »).

IList<FaultReport> faultReports = (from fr in _session.FaultReports
   where fr.CreatedOn > dateTime
   select new FaultReport
   {
       Id = fr.Id,
       ExecutionDate = fr.ExecutionDate ?? DateTime.MinValue,
       FaultType = fr.FaultType,
       Quarters = fr.Quarters,
       InhouseSpaceId = fr.InhouseSpaceId,
       InhouseSpace = new InhouseSpace { Id = fr.InhouseSpace.Id, Name = fr.InhouseSpace.Name },
       InhouseUnitId = fr.InhouseUnitId ?? Guid.Empty,
       **InhouseUnit = fr.InhouseUnitId == Guid.Empty ? null : new InhouseUnit { Id = fr.InhouseUnit.Id, Name = fr.InhouseUnit.Name }**
}).ToList();

В частности, это выражение if, выделенное жирным шрифтом, вызывает исключение.Мне нужно сделать проверку, так как fr.InhouseUnitId обнуляется.Если я вычеркну жирное выражение, остальная часть заявления будет работать нормально.Я потратил довольно много времени на форуме MSDN и в Интернете, чтобы понять, что является причиной исключения, но до сих пор не могу понять.Guid является скалярным, поэтому он должен работать, верно?Даже это выражение InhouseUnit = true ? null: new InhouseUnit() вместо выражения, выделенного жирным шрифтом в приведенном выше утверждении, не будет работать.Можем ли мы даже написать if / else

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

LINQ to Entities does not recognize the method 'System.Object 
GuidConversion(System.Nullable`1[System.Guid], System.Object)' method, and this method 
cannot be translated into a store expression

1 Ответ

0 голосов
/ 05 января 2012

Похоже, что вы проецируете на новые объекты того же типа, с которого вы запрашиваете.Это тот случай?Это кажется немного странным, но если у вас есть веская причина для этого, вы можете разделить запрос на две части.Первая часть получит то, что вам нужно из базы данных.Вторая часть будет работать локально (т.е. LINQ-to-Objects), чтобы дать вам необходимую вам проекцию.Как то так:

var query =
  from fr in _session.FaultReports
  where fr.CreatedOn > dateTime
  select new {
    fr.Id,
    fr.ExecutionDate,
    fr.FaultType,
    fr.Quarters,
    InhouseSpaceId = fr.InhouseSpace.Id,
    InhouseSpaceName = fr.InhouseSpace.Name,
    InhouseUnitId = fr.InhouseUnit.Id,
    InhouseUnitName = fr.InhouseUnit.Name,
  };

IList<FaultReport> faultReports = (
  from fr in query.ToList()
  select new FaultReport {
    Id = fr.Id,
    ExecutionDate = fr.ExecutionDate ?? DateTime.MinValue,
    FaultType = fr.FaultType,
    Quarters = fr.Quarters,
    InhouseSpaceId = fr.InhouseSpaceId,
    InhouseSpace = new InhouseSpace { Id = fr.InhouseSpaceId, Name = fr.InhouseSpaceName },
    InhouseUnitId = fr.InhouseUnitId ?? Guid.Empty,
    InhouseUnit = fr.InhouseUnitId == Guid.Empty ? null : new InhouseUnit { Id = fr.InhouseUnitId, Name = fr.InhouseUnitName }
  }).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...