Linq到SQL搜索通配符在双

本文关键字:通配符 搜索 SQL Linq | 更新日期: 2023-09-27 18:12:44

在Linq 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的记录。

有什么建议吗?

Linq到SQL搜索通配符在双

根据您的评论,.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到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))。

希望对你有帮助。