LINQ Guid toString () - PullRequest
       15

LINQ Guid toString ()

13 голосов
/ 25 марта 2010

Привет, похоже, это должно работать,

from something in collectionofsomestuff       
select new SelectListItem(){Text = something.Name, Value = something.SomeGuid.ToString(), Selected = false};

Когда я пытаюсь сделать это, это не работает, выдает ошибку

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

Есть ли обходной путь?

Ответы [ 6 ]

6 голосов
/ 25 марта 2010

Не все методы CLR могут использоваться с Linq-to-Entities. ToString (), кажется, один из них.

Взгляните на метод CLR для канонического отображения функций .

Возможно, попробуйте явно установить GUID для строковой переменной вне Linq.

string myGuid = SomeGuid.ToString();

from something in collectionofsomestuff       
select new SelectListItem(){Text = Name, Value = myGuid, Selected = false};
5 голосов
/ 11 марта 2011

Вы можете получить записи в БД, а затем превратить их в список или массив, используя ToList () или ToArray (). Затем используйте объект. Например (это LINQ to Entities):

var list = collectionofsomestuff.select(c => c).ToList();
from something in list
select new SelectListItem(){Text = something.Name, Value = something.SomeGuid.ToString(), Selected = false}; 
4 голосов
/ 25 марта 2010

Я не слишком хорошо выражаю выражения запросов Linq, но следующее должно помочь:

collectionofsomestuff //here it's LinqToEntities
    .Select(something=>new{something.Name,something.SomeGuid})
    .ToArray() //From here on it's LinqToObjects
    .Select(s=>new SelectListItem()
        {
            Text = s.Name, 
            Value = s.SomeGuid.ToString(), 
            Selected = false
        })
1 голос
/ 12 марта 2011

У меня была та же проблема, и в итоге я изменил определение своего объекта, чтобы обойти эту проблему. Это полный взлом, но он позволяет мне заполнять данные прямо из запроса:

[DataContract]
public class DeviceInfo
{
    public Guid DeviceGuid
    {
        set
        {
            DeviceID = value.ToString();
        }
    }
    [DataMember]
    public string DeviceID { get; set; }
}

И запрос работает так, как задумано, потому что он выполняет преобразование для чего-то другого:

devices.AddRange(from d in ae.UserDevices
                    select new DeviceInfo
                    {
                        DeviceGuid = d.DeviceID
                    }

Это делает объект немного более беспорядочным, но значительно облегчает работу с Guid в запросе.

1 голос
/ 25 марта 2010

Создайте конструктор для SelectListItem, который принимает ваше значение как Guid и помещает его туда. Теперь назовите ваш запрос так:

from something in collectionofsomestuff select new SelectListItem(something.Name, something.SomeGuid, false);
1 голос
/ 25 марта 2010

Я закончил тем, что делал foreach, вот так

           List<SelectListItem> list  = new List<SelectListItem>();
       foreach (SomeThing something in collectionofsomestuff)
       {
           list.Add(new SelectListItem(){Text = something.Name,Selected = false,Value = something.SomeGuid.ToString()});
       }

это единственный способ заставить его работать ... это не то, что я надеялся сделать жестко ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...