Linq to SQL在double中搜索通配符

时间:2013-05-08 13:46:26

标签: c# linq-to-sql double contains

在Linq to SQL中,我试图搜索double类型的值:

var q = from a in db.GetTable<HKKS_Medlemmer>()
            from g in db.HKKS_Get_grader_Kun_Grad(Convert.ToInt32(a.Skif))
            where a.Aktiv == true &&
             (a.Skif.ToString().StartsWith(SearchValue) ||
             SqlMethods.Like(a.Navn, "%" + SearchValue + "%") ||
              SqlMethods.Like(a.Mellemnavn, "%" + SearchValue + "%") ||
              SqlMethods.Like(a.Efternavn, "%" + SearchValue + "%") ||
              SqlMethods.Like(a.Adresse, "%" + SearchValue + "%") ||
              SqlMethods.Like(a.Telefon, "%" + SearchValue + "%") ||
              SqlMethods.Like(a.Mobil, "%" + SearchValue + "%") ||
              SqlMethods.Like(a.PostNr, "%" + SearchValue + "%") ||
              SqlMethods.Like(a.town, "%" + SearchValue + "%") ||
              SqlMethods.Like(a.mail, "%" + SearchValue + "%"))
            orderby a.Navn
select new
            {
                Grad = g.Grad,
                Skif = a.Skif,
                Navn = a.Navn,
                Mellemnavn = a.Mellemnavn,
                Efternavn = a.Efternavn,
                Adresse = a.Adresse,
                Telefon = a.Telefon,
                Mobil = a.Mobil,
                PostNr = a.PostNr,
                town = a.town,
                mail = a.mail,
                Picture = "http://www.hkks.dk/" + a.Picture,
                Age = db.fn_GetAge((a.CPR), DateTime.Now),
                Cpr = a.CPR

            };

我也试过这个:

var u = from a in db.GetTable<HKKS_Medlemmer>()
                from g in db.HKKS_Get_grader_Kun_Grad(Convert.ToInt32(a.Skif))
                .Where  (p => Object.Equals(a.Skif, SearchValue))
                orderby a.Navn
                select new
                {
                    Grad = g.Grad,
                    Skif = a.Skif,
                    Navn = a.Navn,
                    Mellemnavn = a.Mellemnavn,
                    Efternavn = a.Efternavn,
                    Adresse = a.Adresse,
                    Telefon = a.Telefon,
                    Mobil = a.Mobil,
                    PostNr = a.PostNr,
                    town = a.town,
                    mail = a.mail,
                    Picture = "http://www.hkks.dk/" + a.Picture,
                    Age = db.fn_GetAge((a.CPR), DateTime.Now),
                    Cpr = a.CPR

                };

但如果我正在搜索994并期望结果给我99469的记录,那么他们都没有给我正确的结果。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

从您的评论.StartsWith方法生成以下SQL:

(CONVERT(NVARCHAR(30), [t0].[Skif], 2) LIKE @p11)

您可以使用以下SQL来说明问题:

DECLARE @val AS FLOAT
SET @val = 99469
SELECT CONVERT(NVARCHAR(30), @val, 2)

如果你运行那个SQL,你会看到输出是一个绝对不以“994”开头的字符串:

9.946900000000000e+004

为了在不使用e+表示法的情况下将99469转换为字符串,您可以像这样重写语句:

Convert.ToInt32(a.Skif).ToString().StartsWith(SearchValue)

这将生成以下SQL,它应该可以解决问题:

WHERE (CONVERT(NVarChar,CONVERT(Int,[t0].[Skif]))) LIKE @p11

如果你能宣布这样的话会很好:

a.Skif.ToString("####").StartsWith(SearchValue)

.ToString()方法不支持LINQ to SQL(我尝试时收到Method 'System.String ToString(System.String)' has no supported translation to SQL.错误消息。)

此外,可能还有其他解决方法。使用EF4,SqlFunctions中可能会有一些内容允许您在一个步骤中执行转换,而无需转换为INT(或BIGINT,如有必要)。实际上,所有LINQ to SQL需要做的是生成一个语句,其中0为最后一个参数,而不是2(即CONVERT(NVARCHAR(30), @val, 0))。

希望有所帮助。