2015-08-13 5 views
0

У меня возникла проблема с последних трех дней и не удалось найти решение для google и stackoverflow.Динамический Linq - Методы по типу 'Int32?' не доступны

У меня есть свойство nullable int в моей модели. Когда я пытаюсь применить любую функцию в этом столбце, используя предложение dynamic where, я столкнулся с ошибкой - «Методы по типу« Int32? » не доступны ».

Supposingly, моя модель структура -

public class MyTestModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int? ParentId { get; set; } 
} 

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

Where("Name.StartsWith(\"t\") and ParentId.ToString().StartsWith(\"1\") "); 

Мое решение удовлетворяет всем другим типам, но типы с нулевым значением здесь не работают. Я также попытался проверить нуль, но не работает. (Прочтите это на каком-либо другом форуме):

Where("Name.StartsWith(\"t\") and (ParentId != null and ParentId.ToString().StartsWith(\"1\")) "); 

Where("Name.StartsWith(\"t\") and (ParentId != null and ((int?)ParentId).ToString().StartsWith(\"1\")) "); 

ответ

0

Попробуйте ParentId.Value.ToString().StartsWith(\"1\"). Вам не нужно проверять значения null, если запрос будет выполнен на SQL-сервере, потому что в SQL нет исключений NULL. Если запрос будет выполнен «локально» (против коллекции .NET), вы должны проверить значения null.

+0

Я думал, что вы не можете использовать ToString, если это Linq для Entites, вы должны использовать SqlFunctions.StringConvert, но я не думаю, что вы можете назвать это в динамическом linq. Или у вас есть новые версии EF, добавленные в ToString? – Mant101

+0

@ Mant101 Он не указал, использует ли он EF или Linq-to-Sql. Linq-to-Sql поддерживает '.ToString()' (только что отмечен) – xanatos

+0

ParentId.Value.ToString() работал для меня. Благодарю. Можете ли вы объяснить логику этого? или любая справочная статья, в которой говорится об этом? –