Инициализатор сокращенного свойства Int.Parse

Код :

var page = (from p in dbContext.Page
            where p.Id== Id
            select new PageObject
            {
                PageID = p.PageID,
                CategoryId = p.attr.Any(a => a.Attribute == "CategoryId") ? 
                p.attr.Where(a => a.Attribute == "CategoryId").FirstOrDefault().Value : 0 // How do I convert the Value to Int?
            }).FirstOrDefault();

Проблема :

Мы используем EF в существующем приложении, где в приведенном выше коде он инициализирует PageObject (с множеством свойств, которые я удалил для простоты). CategoryId является целым числом, и я пытаюсь выяснить, как преобразовать значение в int, я я не могу использовать int.Parse в запросе LINQ, так как он выдает ошибку:

LINQ to Entities не распознает метод Int32 Parse(System.String) и этот метод нельзя преобразовать в выражение хранилища.

Примечание. Я не могу избежать использования краткой инициализации свойства, и это необходимо сделать в самом запросе LINQ.


person Murtaza Mandvi    schedule 21.07.2015    source источник
comment
Зачем вам это нужно, если это уже целое число? Насколько мне известно, .NET сможет автоматически анализировать это.   -  person Hozikimaru    schedule 21.07.2015
comment
Почему CategoryId отображается как строка, хотя это явно целое число? Должен ли он изменять типы в базе данных или идентификатор должен быть строкой?   -  person Bas    schedule 21.07.2015
comment
В БД это своего рода hastable, поэтому одно и то же поле может хранить строки и целые числа, в зависимости от ключа, который мы решаем, должен ли он быть целым числом или нет, больше не может изменить эту структуру.   -  person Murtaza Mandvi    schedule 21.07.2015
comment
@Bas Упомянутый вами пост проверяет, являются ли внутренние условные свойства int или нет, мой пост относится ко всему результату преобразования LINQ в int, мне кажется, что он не дублируется!   -  person Murtaza Mandvi    schedule 21.07.2015
comment
Корень проблемы в обоих случаях заключается в преобразовании строки в целое число в базе данных с использованием структуры сущностей. Это одинаково в обоих случаях, даже если вы используете результат по-разному!   -  person Bas    schedule 21.07.2015
comment
Если Value является целым числом, почему бы просто не попробовать прямое приведение, также известное как (int)(p.attr.Where(a => a.Attribute == "CategoryId").FirstOrDefault().Value)? Если я не ошибаюсь, и это строка?   -  person Ron Beyer    schedule 21.07.2015
comment
@RonBeyer Прямое приведение тоже не работает, выдает исключение   -  person Murtaza Mandvi    schedule 21.07.2015
comment
Какое исключение бросает Cast? И обратите внимание, если есть строки, зачем вам все время выполнять преобразование? Конечно, вы не сможете преобразовать его, если оно не является допустимым целым числом.   -  person Hozikimaru    schedule 21.07.2015
comment
Может кто-нибудь, пожалуйста, снова откройте этот вопрос, так как он не кажется мне дублирующим...   -  person Murtaza Mandvi    schedule 21.07.2015
comment
@SurgeonofDeath (int)(p.attr.Where(a =› a.Attribute == CategoryId).FirstOrDefault().Value) Это даже не компилируется и просто говорит, что невозможно преобразовать тип 'string' в 'int'   -  person Murtaza Mandvi    schedule 21.07.2015
comment
@MurtazaMandvi попробуйте Cast‹int›().FirstOrDefault() вместо (int) в начале.   -  person Hozikimaru    schedule 21.07.2015
comment
p.attr.Where(a =› a.Attribute == CategoryId).Cast‹int›().FirstOrDefault().Value — в этом случае объект Value не существует :)   -  person Murtaza Mandvi    schedule 21.07.2015
comment
что происходит, когда вы удаляете значение?   -  person Hozikimaru    schedule 21.07.2015
comment
Это не работает, потому что значение является фактическим свойством из БД, которая содержит мое значение: невозможно преобразовать тип «PageAttr» в тип «System.Int32». LINQ to Entities поддерживает только приведение примитивов EDM или типов перечисления.   -  person Murtaza Mandvi    schedule 21.07.2015
comment
Давайте продолжим обсуждение в чате.   -  person Hozikimaru    schedule 21.07.2015