1

在 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 的记录,他们都没有给我正确的结果。

有什么建议么?

4

1 回答 1

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( 或 a BIGINT,如有必要)。实际上,所有 LINQ to SQL 需要做的就是生成带有 0 作为最后一个参数的语句,而不是 2(即CONVERT(NVARCHAR(30), @val, 0))。

希望有帮助。

于 2013-05-08T15:19:13.687 回答