【问题标题】:Linq to Entities and Xml FieldsLinq to Entity 和 Xml 字段
【发布时间】:2010-12-06 03:01:26
【问题描述】:

我有这种情况:

  1. 具有 field1、xmlField(nvarchar(50) 和 xml sql server 数据类型)的 SQL Server 表 myTable
  2. Linq 到实体

现在我想得到这样的查询:

SELECT Field1, XmlField
FROM MyTable
WHERE CAST(XmlField AS nvarchar(4000)) = '<myXml />'

显然这是 SQL Server 中的正确查询,但我找不到在 L2E 中编写此代码的解决方案。

请通知此代码不起作用:

var query = from row in context.MyTables
            where (string)row.XmlField == "<myXml />"
            select row

还有其他的演员阵容。 这只是因为在 L2E 中“ToString”不能正常工作。

现在我的想法是这个:扩展方法:

var query = from row in context.MyTables
            select row

query = query.CompareXml("XmlField", "<myXml />")

这是扩展方法:

public static IQueryable<TSource> CompareXml<TSource>(this IQueryable<TSource> source, string xmlFieldName, string xmlToCompare)
{
    ConstantExpression xmlValue = Expression.Constant(xmlToCompare);

    ParameterExpression parameter = Expression.Parameter(typeof(TSource), source.ElementType.Name);
    PropertyInfo propertyInfo = typeof(TSource).GetProperty(xmlFieldName);
    MemberExpression memberAccess = Expression.MakeMemberAccess(parameter, propertyInfo);

    var stringMember = Expression.Convert(memberAccess, typeof(string));

    BinaryExpression clauseExpression = Expression.Equal(xmlValue, stringMember);
    return source.Where(Expression.Lambda<Func<TSource, bool>>(clauseExpression, parameter));
}

同样,这也不起作用。

现在我想了解如何使用 Cast 强制“转换”,以便比较 Xml 和 nvarchar。

提前致谢 马西米利亚诺

【问题讨论】:

    标签: entity-framework casting linq-to-entities


    【解决方案1】:

    不幸的是,EF 仍然不能正确支持 XML 列。恐怕我所知道的唯一选择是创建一个执行演员表并将其映射到不同实体的视图。这可能会使代码变得笨拙,但也提供了其他可能的场景;例如,使用大量 SQL 代码,您可以将 XML 列中的元素映射到视图中的实际列,从而允许您对 XML 的特定部分进行查询。

    从好的方面来说,至少在 XML 列中插入值的工作方式与预期的差不多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 2019-06-01
      • 2010-10-30
      相关资源
      最近更新 更多