LINQ Guid toString()

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

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

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

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

Есть ли способ обхода?

Ответы

Ответ 1

Не все методы 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};

Ответ 2

Вы можете получить записи в db, а затем включить их в список или массив, используя 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}; 

Ответ 3

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

collectionofsomestuff //here it LinqToEntities
    .Select(something=>new{something.Name,something.SomeGuid})
    .ToArray() //From here on it LinqToObjects
    .Select(s=>new SelectListItem()
        {
            Text = s.Name, 
            Value = s.SomeGuid.ToString(), 
            Selected = false
        })

Ответ 4

В итоге я сделал так, чтобы сделать 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()});
       }

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

Ответ 5

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

from something in collectionofsomestuff select new SelectListItem(something.Name, something.SomeGuid, false);

Ответ 6

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

[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 в запросе.