LINQ Guid toString()

时间:2010-03-25 01:11:27

标签: c# linq linq-to-entities

嗨,这似乎应该可行,

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

当我尝试这样做时,它不起作用给我错误

  

LINQ to Entities无法识别方法'System.String ToString()'方法,并且此方法无法转换为商店表达式。

有解决方法吗?

6 个答案:

答案 0 :(得分:6)

并非所有CLR方法都可以与Linq-to-Entities一起使用。 ToString()似乎就是其中之一。

看看CLR Method to Canonical Function Mapping

也许尝试在Linq之外明确地将GUID设置为字符串变量。

string myGuid = SomeGuid.ToString();

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

答案 1 :(得分:5)

您可以在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}; 

答案 2 :(得分:4)

我不太了解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
        })

答案 3 :(得分:1)

我最终做了这样的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()});
       }

这是我能让它发挥作用的唯一方法..这不是我希望做的事情......

答案 4 :(得分:1)

为SelectListItem创建一个构造函数,该构造函数接受您的Value作为Guid并在那里ToString它。现在调用您的查询:

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

答案 5 :(得分:1)

我遇到了同样的问题,最后我改变了对象的定义以解决问题。这是一个完整的黑客,但它允许我直接从查询填充数据:

[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变得更加容易。