2009-10-12 93 views
4

我有這樣的場景:LINQ到實體和XML字段

  1. 與FIELD1,xmlField(爲nvarchar(50)和XML SQL Server數據類型)
  2. LINQ到實體SQL Server表myTable的

現在我想獲得這樣的查詢:

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

回答

0

不幸的是EF仍不能正常支持XML列。我非常害怕,我所知道的唯一選擇是創建一個視圖來執行演員表並將其映射到另一個實體。這可能會使代碼尷尬,但也提供了更多可能的場景;例如,使用大量的SQL代碼,您可以將XML列中的元素映射到視圖中的實際列,從而允許您查詢XML的特定部分。

好的一面,至少在XML列中插入值的工作方式與預期相當。