.net IQueryable泛型类型存在问题--无法将“System.Xml.Linq.XElement”类型的对象强制转换为“X”类型

.net IQueryable泛型类型存在问题--无法将“System.Xml.Linq.XElement”类型的对象强制转换为“X”类型,.net,asp.net-mvc-4,linq-to-xml,.net,Asp.net Mvc 4,Linq To Xml,我正在尝试构建一个存储库,它采用泛型类型并返回泛型IQueryable。当数据源是db表时,我让它运行。当数据源是XML文档时,我想做同样的事情,但我无法让它工作 代码如下: public IQueryable<T> GetAll() { XElement xml = XElement.Load(this.url); IQueryable<T> nodes = null; nodes = ( from c in xml.Nodes().C

我正在尝试构建一个存储库,它采用泛型类型并返回泛型IQueryable。当数据源是db表时,我让它运行。当数据源是XML文档时,我想做同样的事情,但我无法让它工作

代码如下:

public IQueryable<T> GetAll()
{
    XElement xml = XElement.Load(this.url);

    IQueryable<T> nodes = null;
    nodes = (
    from c in xml.Nodes().Cast<T>()
    select c).AsQueryable<T>();

    return nodes;
}
顺便说一下,这是在运行时发生的错误,而不是编译时发生的错误:

无法将“System.Xml.Linq.XElement”类型的对象强制转换为“X”类型

提前感谢您的回复。

您试图将XElement转换为T,而不是它的值。您应该能够使用:

public IQueryable<T> GetAll() where T : IConvertible
{
    XElement xml = XElement.Load(this.url);

    var nodes = xml.Nodes().Select(xe => Convert.ChangeType(xe.Value, typeof(T))).Cast<T>();
    return nodes.AsQueryable();
}

其工作原理是将值提取为字符串,并使用Convert尝试将其映射到指定的类型。这需要T类型来实现,所以我还添加了该约束。

您是否正在寻找一种将XML文档自动转换为自定义类的解决方案?没有比这更好的了

可能的解决办法:

使用转换方法准备接口,并使用该方法将XElement转换为类实例:

public interface IXEntity<T>
{
    T GetEntity(XElement source);
}

public IQueryable<T> GetAll<T>(IXEntityFactory<T> factory)
{
    XElement xml = XElement.Load(this.url);

    var nodes = xml.Elements().Select(xe => factory.GetEntity(xe));
    return nodes.AsQueryable();
}
或扩展方法以获取转换委托:

public IQueryable<T> GetAll<T>(Func<XElement, T> projection)
{
    XElement xml = XElement.Load(this.url);

    var nodes = xml.Elements().Select(xe => projection(xe));
    return nodes.AsQueryable();
}

顺便说一句,我不知道你为什么要用IQueryable。LINQ to XML无论如何都使用IEnumerable,所以有AsEnumerable和没有该调用的版本之间没有区别。

@MarcinJuraszek-Yeah-意识到通常会出现故障,所以在字符串值上返回Convert.ChangeType。变化不大。仍然需要将自定义字符串转换为T。通过只获取价值,您就失去了文档结构。我想说,定义MyClassXElement转换比定义MyClassstring更好。@MarcinJuraszek是的,它需要实现IConvertible。将此添加到回答文本中的注释中。不过,我不相信有办法解决这个问题。啊,这给了我解决困境所需要的洞察力。准备一个带有转换方法的接口,并使用该方法将XElement转换为类实例