2010-07-30 2 views
2

Я пытаюсь получить значение строки «Администратор» из запроса Linq, но когда я делаю:Как мне не вернуть {ModuleName = Admin} из запроса linq?

string oldModule = dc.Modules 
          .Where(x => x.Id == um.ModuleId) 
          .Select(s => new {s.ModuleName}) 
          .FirstOrDefault().ToString(); 

возвращает {ModuleName = Администратор} в oldModule переменной вместо просто Admin.

ответ

9

Это потому, что вы внесли анонимный тип в проекцию. Попробуйте это:

string oldModule = dc.Modules 
        .Where(x => x.Id == um.ModuleId) 
        .Select(s => s.ModuleName) 
        .FirstOrDefault(); 

Я удалил ToString вызова, а также, который бы бросил NullReferenceException если предложение Where, не совпадут ничего.

+0

... сделал это снова. :-P –

+0

Спасибо, я полностью забыл, что могу сделать это только с s => s.ModuleName, по какой-то причине у меня это застряло в голове, когда мне нужно выбрать отдельные столбцы, а не все, мне нужно сделать s => new {...} – Xaisoft

2
 string oldModule = dc.Modules 
         .Where(x => x.Id == um.ModuleId) 
         .Select(s => s.ModuleName) 
         .FirstOrDefault().ToString(); 
2

насчет просто выбрать ModuleName недвижимость?

(from m in dc.Modules 
where m.Id == um.ModuleId 
select m.ModuleName).FirstOrDefault() 
0

Что нового делать в

.Select(s => new {s.ModuleName}) 

Я не знаю, что вы вопрос, но я не удивлюсь, если это часть его ..

Я также мог бы просто сделать .Single (s => s.ModuleName) вместо .select и .firstordefault.

+0

Я не на 100% знаком с linq 2 sql. Я действительно не понимаю разницы между Single, SingleOrDefault, First, FirstOrDefault – Xaisoft

1

Это происходит потому, что новый {...} создает новый анонимный тип в Select. Когда вы вызываете ToString(), вы вызываете его в этом анонимном типе, а не в строке ModuleName. Если вы просто напишите .Select (s => s.ModuleName), вы вернете строку вместо анонимного типа, а oldModule будет содержать Admin.

На самом деле вам даже не нужно ToString() в конце запроса, так как результат FirstOrDefault() уже является строкой.

+0

После того, как я удалил новое и просто сделал s => s.ModuleName, resharper сказал мне, что ToString() был избыточным, lol. Можете ли вы объяснить анонимный тип? Спасибо за короткое объяснение кстати. – Xaisoft

+0

Позвольте мне перепрыгнуть вперед, потому что, когда я делаю s => new {s.ModuleName}, он не знает, что такое тип s.ModuleName, или я смотрю на это неправильно? – Xaisoft

+0

Анонимный тип - это тип, который генерируется компилятором, когда он встречает новый синтаксис {...}. Он не имеет определенного имени, поэтому он называется анонимным. Компилятор генерирует тип, создавая одно свойство для каждого элемента, который он находит внутри фигурных скобок. В вашем случае компилятор создал анонимный тип с именем ModuleName, значением которого является Admin. Вы можете найти гораздо больше о них по адресу http://msdn.microsoft.com/en-us/library/bb397696.aspx –

Смежные вопросы