Оценить «изображение» столбца SQL в запросе - PullRequest
0 голосов
/ 29 мая 2011

У меня есть база данных, содержащая таблицу с колонкой «Изображение»: Management Studio Screncap

Этот столбец на самом деле содержит длинную строку, закодированную в виде шестнадцатеричных байтов.

Мне нужно выбрать все записи, в которых строка, закодированная этим столбцом, содержит определенную подстроку. Псевдокод будет:

Select *
From SomeTable
Where dataColumnofTypeImage.ToString().Contains("somesubstring")

Я пытался сделать это в Linq (LinqPad), используя:

from z in Zanus
let p = z.Udata.ToArray() // z.Udata will be of type System.Linq.Binary so I want to     make a byte array out of it...
where System.Text.ASCIIEncoding.ASCII.GetString(p).Contains("EXED")
select new
{
    z.Idnr,
    z.Udatum,
    z.Uzeit,
    z.Unr,
    z.Uart,
    z.Ubediener,
    z.Uzugriff,
    z.Ugr,
    z.Uflags,
    z.Usize,
    z.Udata
}

Но это совсем не работает, говоря:

NotSupportedException: у метода 'Byte [] ToArray ()' нет поддерживаемого перевода в SQL.

Я просто не могу поверить, что невозможно проверить бинарный тип данных в предложении Where так же, как я могу проверить другой тип данных ...

Может кто-нибудь помочь мне здесь?

Ответы [ 2 ]

0 голосов
/ 30 мая 2011

Единственный способ, которым я знаю об этом, - это использовать прямой sql и подстроку

Например, что-то вроде:

string str1 = @"
    select 
        Idnr, 
        Udatum,
        Uzeit, 
        Unr, 
        Uart, 
        Ubediener, 
        Uzugriff, 
        Ugr,
        Uflags, 
        Usize, 
        Udata 
    from  Zanus 
    where Udata is not null 
       and SubString(Udata, 1 , 2147483647) like '%EXED%'" ;

    var query1 = this.ExecuteQuery<Zanus>(str1);
    (from z in query1 
    select new
    {
        z.Idnr,
        z.Udatum,
        z.Uzeit,
        z.Unr,
        z.Uart,
        z.Ubediener,
        z.Uzugriff,
        z.Ugr,
        z.Uflags,
        z.Usize,
        z.Udata
    }    

Обратите внимание, что произойдет сбой, если строка поискав столбце, но не в первых 2 147 483 647 байт (но если это изображения, я не думаю, что это должно вызывать беспокойство).

0 голосов
/ 29 мая 2011
where p.Contains(System.Text.ASCIIEncoding.ASCII.GetString("EXED"))

Вероятно, это будет код того, что вы пытаетесь сделать, будет ли это работать, зависит от вашей строки изображения

...