Linq to Entities和Xml Fields

时间:2009-10-12 20:53:32

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

我有这种情况:

  1. 带有field1,xmlField(nvarchar(50)和xml sql server数据类型)的SQL Server表myTable
  2. Linq to entities
  3. 现在我想得到这样的查询:

    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。

    提前致谢 的Massimiliano

1 个答案:

答案 0 :(得分:0)

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

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