Querying SQL Server xml column with user provided XPath via Entity Framework

后端 未结 2 1042
执念已碎
执念已碎 2021-01-05 22:25

I\'m having a really tough time figuring how to use an xml data column in SQL Server, specifically for use with Entity Framework.

Basically, one of our tables stores

相关标签:
2条回答
  • 2021-01-05 22:58

    To remain "customisable", the SqlQuery method on DbSet can be used:

    var query = @"SET ARITHABORT ON; 
                  select * from [YourTable] where 
                  [xmlcol].exist('/path1/path2[0][text()=''{0}''']";
    var numOfResults = 5;
    var offsetPage = 1;
    
    var results = Context.YourTable.SqlQuery(String.Format(query,"valuetest"))
                                  .OrderBy(x => x.col)
                                  .Skip(offsetPage * numOfResults)
                                  .Take(numOfResults).ToList();
    

    Note, due to its dynamic nature, this method would also most likely expose some degree of sql injection security holes.

    0 讨论(0)
  • 2021-01-05 23:08

    You could do this in a stored procedure where you build your query dynamically.

    SQL Fiddle

    MS SQL Server 2008 Schema Setup:

    create table YourTable
    (
      ID int identity primary key,
      Name varchar(10) not null,
      XMLCol xml
    );
    
    go
    
    insert into YourTable values
    ('Row 1', '<x>1</x>'),
    ('Row 2', '<x>2</x>'),
    ('Row 3', '<x>3</x>');
    
    go
    
    create procedure GetIt
      @XPath nvarchar(100)
    as
    begin
      declare @SQL nvarchar(max);
    
      set @SQL = N'
      select ID, Name
      from YourTable
      where XMLCol.exist('+quotename(@XPath, '''')+N') = 1';
    
      exec (@SQL);
    end
    

    Query 1:

    exec GetIt N'*[text() = "2"]'
    

    Results:

    | ID |  NAME |
    --------------
    |  2 | Row 2 |
    
    0 讨论(0)
提交回复
热议问题