问题描述
|
我正在创建一个通用的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是否会起作用。