3

我正在创建一个通用的xmlRepository,我可以通过任何类型并返回列表。泛型和LINQ到XML

目前我的代码看起来是这样的(只有这样我可以得到它的工作):

public IQueryable<TEntity> GetQuery<TEntity>() where TEntity : class 
{ 
    var filename = GetEntityFileName<TEntity>(); 
    var doc = XDocument.Load(filename); 
    var query = (from p in doc.Descendants(entityName) 
       select (ServiceAccount)p).AsQueryable().Cast<TEntity>(); 
    return query; 
} 

我想与

select (TEntity)p).AsQueryable(); 
换出

select (ServiceAccount)p).AsQueryable().Cast<TEntity>(); 

实体是与ServiceAccount相同的对象,

LINQ to XML有可能吗?

我有一个SQLRepository,使用EF,具有相同的方法,它和我寻找的LINQ to XML相当于

((IObjectContextAdapter)_context).ObjectContext.CreateQuery<TEntity>(entityName); 

如果确实有一个。

+2

当你尝试第二种方法时,你会得到什么类型的错误? – taylonr 2011-05-26 12:37:07

+0

您是否首先使用实体​​框架代码? – abatishchev 2011-05-26 12:40:33

+0

无法将类型'System.Xml.Linq.XElement'转换为'TEntity'。 我也试过[code] select(typeof(TEntity))p).AsQueryable()。OfType (); – user771184 2011-05-26 12:42:50

回答

3

您需要指定如何将XElement转换为T的实例。目前您的代码根本无法使用,除非ServiceAccount已经从XElement明确转换。

您可能需要为具有在每个实体类型的静态FromXElement方法的公约 - 那么你可以调用,从反思,甚至有一本字典:

private static readonly Dictionary<Type, Delegate> Converters = 
    new Dictionary<Type, Delegate> { 
     { typeof(ServiceAccount), 
      (Func<XElement, ServiceAccount>) ServiceAccount.FromXElement }, 
     { typeof(OtherEntity), 
      (Func<XElement, OtherEntity>) OtherEntity.FromXElement }, 
    }; 

你会那么喜欢写东西:

public IQueryable<TEntity> GetQuery<TEntity>() where TEntity : class 
{ 
    Delegate converter; 
    if (!Converters.TryGetValue(typeof(TEntity), out converter)) 
    { 
     throw new InvalidOperationException("..."); 
    } 
    Func<XElement, TEntity> realConverter = (Func<XElement, TEntity>) converter; 

    var filename = GetEntityFileName<TEntity>(); 
    var doc = XDocument.Load(filename); 
    return doc.Descendants(entityName) 
       .Select(realConverter) 
       .AsQueryable(); 
} 

这真不明白你为什么使用IQueryable<T>这里,顺便...什么错只IEnumerable<T>

+0

该解决方案效果很好。谢谢约翰 – user771184 2011-05-26 13:16:11

0

pXElement,对吧?

然后你投了ServiceAccount就可以了。它工作吗?

这个班的签名是什么?

我怀疑通用约束TEntity : class是否可以工作。

+0

作为ServiceAccount投入运行。 我在想,我只需要实现一个类型的开关盒,并有不同的linq-to-xml查询 – user771184 2011-05-26 12:49:16