【发布时间】:2010-12-06 03:01:26
【问题描述】:
我有这种情况:
- 具有 field1、xmlField(nvarchar(50) 和 xml sql server 数据类型)的 SQL Server 表 myTable
- 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