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