在查询中评估“image”SQL列

时间:2011-05-28 23:15:14

标签: c# sql linq linqpad

我有一个包含带有“Image”列的表的数据库: Management Studio Screncap

此列实际上包含一个编码为HEX字节值的长字符串。

我需要选择此列编码的字符串包含某个子字符串的所有记录。伪代码将是:

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 :(得分:0)

where p.Contains(System.Text.ASCIIEncoding.ASCII.GetString("EXED"))

这可能是你要做的事情的代码,它是否会起作用取决于你的图像字符串

答案 1 :(得分:0)

我知道这样做的唯一方法是使用直接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字节中没有,那么这将失败(但如果这些是图像,我认为这不应该是一个问题)。