Как получить только 1,0 и 0,5 значения с LINQ to SQL? - PullRequest
1 голос
/ 31 января 2012

У меня есть список параметров, идущий от -20,00 до 20,00 с шагом 0,25.Иногда мне нужен весь список, но в некоторых случаях мне нужны только параметры с шагом 0.50 ex: в значениях 1.00;1,25;1,50;1,75;2,00;2,25;2,50;2,75;3,00 мне нужно только 1,00;1,50;2,00;2,50;3.00

Я попробовал это

 return From le In dbiLens.Lens
             Join dia In dbiLens.LensDiameters On dia.DiameterID Equals le.DiameterID
             Join krom In dbiLens.LensKrommings On krom.KrommingID Equals le.KrommingID
             Join sterk In dbiLens.LensSterktes On sterk.SterkteID Equals le.SterkteID       
    Where Right(CStr(le.Sterkte), 2) <> "25" Or Right(CStr(le.Sterkte), 2) <> "75"
        Where (le.TypeID = pLensTypeID AndAlso le.GebruiksduurID = pLensPeriodeID _
        AndAlso dia.Diameter = pLensDiaMin _
        AndAlso krom.Kromming = pLensKromMin _
        AndAlso sterk.Sterkte >= pLensSterkteMin AndAlso sterk.Sterkte <= LensSterkteMax)
                                Select le

И попробовал это

Return From le In dbiLens.Lens
         Join dia In dbiLens.LensDiameters On dia.DiameterID Equals le.DiameterID
         Join krom In dbiLens.LensKrommings On krom.KrommingID Equals le.KrommingID
         Join sterk In dbiLens.LensSterktes On sterk.SterkteID Equals le.SterkteID _        
Where sterk.sterkte Mod 0.50 = 0 
    Where (le.TypeID = pLensTypeID AndAlso le.GebruiksduurID = pLensPeriodeID _
    AndAlso dia.Diameter = pLensDiaMin _
    AndAlso krom.Kromming = pLensKromMin _
    AndAlso sterk.Sterkte >= pLensSterkteMin AndAlso sterk.Sterkte <= pLensSterkteMax)
                            Select le

Я понял, что не могу этого сделать, потому что я пытаюсь продолжитьоператор where для запроса, который еще не существует, поэтому я должен использовать процедуру Let.Но я не могу понять это правильно ... У кого-нибудь есть простой пример?

thx

Ответы [ 3 ]

1 голос
/ 31 января 2012
Dim halfOrInteger = From n In numbers
                    Where n * 2 Mod 1 = 0

или в синтаксисе метода:

Dim halfOrInteger = numbers.Where(Function(n) n * 2 Mod 1 = 0)

Редактировать : Очевидно, что LINQ-to-SQL не может перевести это на рабочий SQL.

Операторы арифметики и сравнения работают как обычно в общих время выполнения языка (CLR), за исключением следующего:

  • SQL не поддерживает оператор модуля для чисел с плавающей запятой.

http://msdn.microsoft.com/en-us/library/bb882653.aspx

Я должен признать, что у меня мало опыта работы с LINQ-to-SQL, но кажется, что вы не можете использовать самые полезные функции / операторы, такие как% / Mod или IndexOfAny. Но попробуйте следующее (проблемы локализации включены;)):

Dim halfOrInteger = From n In numbers
                    Let doubleNumString = (n * 2).ToString
                    Let IsDoubleInt = doubleNumString.IndexOf("."c)=-1 _
                              AndAlso doubleNumString.IndexOf(","c)=-1
                    Where IsDoubleInt
                    Select n
0 голосов
/ 01 февраля 2012

Если вы составляете список значений, которые вы хотите сопоставить:

Dim requiredSterkte As New List(Of Double)
For i = 2 To 6
    requiredSterkte.Add(i * 0.5)
Next

тогда вы можете использовать

Where requiredSterkte.Contains(le.Sterkte)

Иногда не стоит пытаться делать все в одну строку.

0 голосов
/ 31 января 2012
Return (From p IN dbi.database
        Join p2 in dbi.database on p2.steID Equals p.SteID
        Where p2.SteID Mod .50 = 0
        Select P).ToList()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...