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);
如果真的有。
您需要指定如何将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
是否有效。