Как использовать linq to sql, чтобы выбрать один столбец из строки - PullRequest
5 голосов
/ 18 декабря 2010

Я использую этот C # с linq to sql:

string currentLabel = from s2f in stream2FieldTypesTable
                      where s2f.s2fID == item.s2fID
                      && (s2f.s2fLabel != item.s2fLabel || s2f.s2fIsRequired != item.s2fIsRequired)
                      select s2f.s2fLabel;

Я получаю сообщение об ошибке компилятора, говорящее, что я не могу присвоить тип System.Linq.IQueryable<string> string.

Iпопробовал этот код:

string currentLabel = from s2f in stream2FieldTypesTable
                      where s2f.s2fID == item.s2fID
                      && (s2f.s2fLabel != item.s2fLabel || s2f.s2fIsRequired != item.s2fIsRequired)
                      select s2f.s2fLabel.ToString();

И это возвращает ту же ошибку.Я уверен, что это простая вещь.что мне не хватает?Я просто хочу первый s2fLabel, который соответствует предложению where.

Ответы [ 5 ]

13 голосов
/ 18 декабря 2010

Фактический тип вашего запроса будет IEnumerable . В LINQ есть концепция отложенное выполнение , для того чтобы запрос был фактически выполнен, вам нужно вызвать метод, который будет повторяться по IEnumerable :

    string currentLabel = (from s2f in stream2FieldTypesTable
                          where s2f.s2fID == item.s2fID
                          && (s2f.s2fLabel != item.s2fLabel || s2f.s2fIsRequired != item.s2fIsRequired)
                          select s2f.s2fLabel)
                         .FirstOrDefault();

Для получения точного одного экземпляра это может быть метод FirstOrDefault () или SignleOrDefault () или просто First () или Single () . Единственное отличие состоит в том, что методы без «OrDefault ()» будут генерировать исключение, если перечисление не будет соответствовать их ожиданиям, а методы с «OrDefault ()» будут просто возвращать ноль.

Редактировать

Разница между Single и First заключается в том, что Single ожидает точный элемент в коллекции и First ожидает как минимум один элемент.

2 голосов
/ 17 августа 2014
 int id =Convert.ToInt32(db.Table.Single(x => x.Id == id_factor).Id);
1 голос
/ 18 декабря 2010

Все, что вам нужно сделать, это добавить круглые скобки до и после вашего LINQ, а затем использовать .FirstOrDefault (), если вам нужно только одно значение (которое имеет строку currentLabel).

string currentLabel = (из s2f в stream2FieldTypesTable где s2f.s2fID == item.s2fID && (s2f.s2fLabel! = item.s2fLabel || s2f.s2fIsRequired ! = item.s2fIsRequired) выберите s2f.s2fLabel) .irstOrDefault ();

1 голос
/ 18 декабря 2010

Попробуйте этот код

var result = (from s2f in stream2FieldTypesTable
                      where s2f.s2fID == item.s2fID
                      && (s2f.s2fLabel != item.s2fLabel || s2f.s2fIsRequired != item.s2fIsRequired)
                      select s2f.s2fLabel).First();

это нужно, потому что ваш результат

IEnumerable<String>
1 голос
/ 18 декабря 2010

Попробуйте First() или FirstOrDefault() вместо (или в дополнение к) ToString().

First и FirstOrDefault возвращают одну запись, а не набор записей, что и делает ваш первый запрос.

...