Generics and LINQ to XML

本文关键字:XML to LINQ and Generics | 更新日期: 2023-09-27 17:57:47

我正在尝试创建一个通用的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到XML

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

如果真的有。

Generics and LINQ to XML

您需要指定如何将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>有什么问题吗?

p就是XElement,对吗?

然后你在上面投ServiceAccount。它有效吗?

这个班的签名是什么?

我怀疑通用约束TEntity : class是否有效。