【问题标题】:Generics and LINQ to XML泛型和 LINQ to XML
【发布时间】:2011-09-02 13:37:31
【问题描述】:

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

如果确实有的话。

【问题讨论】:

  • 尝试第二种方法时遇到什么类型的错误?
  • 您是否首先使用实体​​框架代码?
  • 无法将类型“System.Xml.Linq.XElement”转换为“TEntity”。我也试过 [code] select (typeof(TEntity))p).AsQueryable().OfType();

标签: c# entity-framework generics linq-to-xml repository-pattern


【解决方案1】:

您需要指定如何将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&lt;T&gt; 的原因不是很清楚......只是IEnumerable&lt;T&gt; 有什么问题吗?

【讨论】:

    【解决方案2】:

    pXElement,对吧?

    然后你对它施放ServiceAccount。有用吗?

    这个类的签名是什么?

    我怀疑通用约束 TEntity : class 是否会起作用。

    【讨论】:

    • Cast as ServiceAccount 确实有效。我在想我只需要实现类型的 switch case 并有不同的 linq-to-xml 查询
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多