泛型和LINQ to XML

问题描述

| 我正在创建一个通用的xmlRepository,可以在其中传递任何类型并获取列表。 目前,我的代码如下所示(只有这样我才能正常工作):
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 (ServiceAccount)p).AsQueryable().Cast<TEntity>();
select (TEntity)p).AsQueryable();
TEntity与ServiceAccount是同一对象, LINQ to XML有可能吗? 我有一个使用EF的sqlRepository,它具有相同的方法,并且正在寻找LINQ to XML等效项
((IObjectContextAdapter)_context).ObjectContext.createquery<TEntity>(entityName);
如果确实存在。     

解决方法

您需要指定将
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),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>
,... 12 ...有什么问题吗?     ,
p
XElement
,对吗? 然后,在其上投放
ServiceAccount
。它行得通吗? 此类的签名是什么? 我怀疑通用约束ѭ16是否会起作用。