Question

IIF in where clause of a Linq query

Asked by: MadIce

can a case statement or iif statement be used in a linq query? heres what I have as a query.

dim vw1 = from vw in table1 _
where value1 = strvalue1 and (value2 is nothing or value2 = strvalue2) _
select vw.value1
problem is value2 is whatever was selected from a combobox. Sometimes the value should be null. It shouldn't be looking for nothing or what ever value was assigned to strvalue2.  problem is if I take out the "value2 is nothing or"  part when user selects null I get no records.  So I was thinking of using a case statement or IIF statement but not sure if you can in the where clause or what the syntax is. any ideas. using VB 2008

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2009-08-12 at 15:51:09ID24648340
Topics

Language Integrated Query - LINQ

,

Visual Basic Programming

Participating Experts
1
Points
500
Comments
15

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. IIf statement
    I am trying to run an iif statement like the following and for some reason the last part with the and does not work the formula passes as correct and will run but will not effect the outcome. This is an update statement in access IIf([table1!field1] Is Null,"test1&quo...

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: abelPosted on 2009-08-12 at 16:19:14ID: 25084070

Yes, you can use IIF, and no, you cannot use select case.

The problem with IIF is that all parts are evaluated (even if the first part is false), so that's not a solution. What you need is AndAlso, which will only evaluate the first part and stop then if it is false (because there's no need to continue), the counterpart for Or is OrElse:

where value1 = strvalue1 AndAlso (value2 Is Nothing OrElse value2 = strvalue2)


 

by: abelPosted on 2009-08-12 at 16:21:13ID: 25084090

BTW: to make this kind of queries more readable, it is common practice to the whole boolean logic part (the part in the where statement) inside a function:

Function CheckValues(val1 As String, val2 As String) As Boolean
  ' do your thing here
End Function

and then, the where part becomes:

where CheckValues(value1, value2)

etc.

 

by: MadIcePosted on 2009-08-13 at 07:38:08ID: 25088743

abel, I'll check your example this morning but had a question on your second statement. is the following what you're talking about.
private sub run()
     dim vw1 = from vw in table1 _
     where CheckValues(value1, value2)  _
     select vw.value1
end sub

Function CheckValues(val1 As String, val2 As String) As Boolean
   
End Function

I'm not following because the function would return true or false so how does this translate to the string for the where clause like where str = 'ABC'


 

by: MadIcePosted on 2009-08-13 at 08:28:05ID: 25089480

I'm running my code to see if example works but not sure I explain the issue correct. for the second value I have this:    (value2 is nothing or value2 = strvalue2)  but what I need is something like this:

strvalue2 = Change.SelectedValue

dim vw1 = from vw in table1 _
where value1 = strvalue1 and  (IIF(strvalue2 is nothing, value2 is nothing, value2 = strvalue2))  _
select vw.value1
if the strvalue2 is nothing, I can't use value2= strvalue2. It has to be value2 is nothing. as far as I know.
But I can't get the IIF to work and not sure of another way. The example you gave is working the same as with what I have.   Just to make sure I explain this right, what I'm trying to do is determine what strvalue2 is.  strvalue2 can either be a number or it can be null. The null value is the problem. if i breakdown my IIF statement it would be like this.
If strvalue2 is nothing then value2 is nothing
else value2 = strvalue2

 

by: abelPosted on 2009-08-14 at 04:21:09ID: 25096838

>  so how does this translate to the string for the where clause like where str = 'ABC'

that part goes in the function. The where clause must return true or false anyway. You are doing some logic on two values, which is why I suggested to use a function.

The statement you gave was exactly what I meant (apart from that the function CheckValues must do something and that it seems that you didn't yet give the correct parameters to the function).

I like to help, but the statement you have been posting here was not a correct or working LINQ statement, so I figured you made it up for the sake of explaining your situation. But now I think you have some trouble getting the statement correct. It should be something like this (i.e., you must do something with the object "vw" that is different in each iteration, just like in a normal SQL statement). Something like this (just an example), which tests for nothingness and for either "hello" or "world", if either is in the item, it goes into vw1. The loop at the end with print "hello" and "world".

If you'd follow up with a descriptive example of what's in your table1 (the type of object) and how you want to filter it, I can help you setting up the where statement, without the use of IIF (which should be avoided almost always).

-- Abel --

Dim table1 As String() = New String() {"ttt", "", "hello", Nothing, "test", "world"}
Dim strValue1 As String = "hello"
Dim strValue2 As String = "world"
Dim vw1 = From vw In table1 _
          Where vw IsNot Nothing AndAlso _
          (vw = strValue1 OrElse vw = strValue2) _
          Select vw
 
For Each s In vw1
    Debug.WriteLine(s)
Next
                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:

Select allOpen in new window

 

by: MadIcePosted on 2009-08-14 at 07:32:11ID: 25098448

I had a feeling I was explaining this wrong.  What you mention is your last post is what I'm doing but its not what I want to do. I'm trying to change it. If I break it into to two queries, maybe it will be more clear.
dim str1 as string = cmbobox1.text
if str1 = "" then str1 is nothing

if str1 is nothing then
   dim Results = from vw In table1 _
                         Where vw.value1 = str2 and vw.value2 is nothing
                          Select vw.value1, vw.value2
else
   dim Results = from vw In table1 _
                         Where vw.value1 = str2 and vw.value2 = str1
                          Select vw.value1, vw.value2
end if  

the only difference in the two queries is if str1 is nothing I can't use = str1 because I get no results. the value in the table is null in these cases. So what I'm trying to do is combine the two queries into one but only want the result based on the one condition not both. Hope this makes more sense.

 

by: abelPosted on 2009-08-14 at 08:08:01ID: 25098826

As a result you want both result sets, right?

So, just to see if I get this straight, for an item to be included, it must have:

-  value1 equal to str2 AND
-  value2 equal to nothing or equal to str1

Put in another way: value2 can either be nothing and if it isn't nothing, it must equal str2. In LINQ this looks like this:

Dim Results = From vw In table1 _
              Where vw.value1 = str2 
              AndAlso (vw.value2 Is Nothing OrElse vw.value2 = str2)
              Select vw.value1, vw.value2

                                              
1:
2:
3:
4:

Select allOpen in new window

 

by: MadIcePosted on 2009-08-20 at 11:12:46ID: 25145519

Sorry abel, never got an email about a response.  not sure this is correct "value2 can either be nothing and if it isn't nothing, it must equal str2".   str2 is either nothing or equals something. if str2 is nothing, then I only want the records that have value2 is nothing. if str2 has a value than I only want records that equal that value. So if str2 has a value, I don't want to see the nothing records.

 

by: abelPosted on 2009-08-20 at 16:22:40ID: 25147963

Sorry, you mean to say that the input string, the one you test for, should be tested for nothingness? I don't mind, but that's the reverse of what you wrote so far. Let's make a little table, because I think we're getting very confused by trying to put boolean logic into english words.

To make it clear what we talk about, I call the data in the list datavalue1 and datavalue2 and I call the query strings search1 and search2 (what you and I have called str1 and str2 in the last comments).

// search1 contains a value
search2 is nothing, return if datavalue2 is nothing and datavalue1 is search1
search2 contains value, return if datavalue2 equals search2 and datavalue1 equals search1
 
// search1 contains nothing
search2 is nothing, return if datavalue2 is nothing and datavalue1 is nothing
search2 contains value, return if datavalue2 is search2 and datavalue1 is nothing

                                              
1:
2:
3:
4:
5:
6:
7:

Select allOpen in new window

 

by: abelPosted on 2009-08-20 at 16:28:40ID: 25147996

In your penultimate comment, you showed a snippet where it seemed that you accidentally mixed the value1 == str2, where it should've been value1 == str1. I did the same in the follow up comment, but in your original statement there's nothing of that sort.

To summarize the above and if we just consider Nothing another value, then we just have to return everything that equals both values. If that's the case, it looks like this:

Dim Results = From vw In table1 _
    Where 
    ((str1 Is Nothing AndAlso vw.value1 Is Nothing)
    OrElse (str1 IsNot Nothing AndAlso vw.value1 = str1))
    AndAlso
    ((str2 Is Nothing AndAlso vw.value2 Is Nothing)
    OrElse (str2 IsNot Nothing AndAlso vw.value2 = str2))
    Select vw.value1, vw.value2

                                              
1:
2:
3:
4:
5:
6:
7:
8:

Select allOpen in new window

 

by: abelPosted on 2009-08-20 at 16:33:02ID: 25148012

> I don't mind, but that's the reverse of what you wrote so far.

I'm sorry, that was a bit rude of me and it is not true. In different posts, different things got mixed up, by large because we stick to this value1 vs value2 thing that nobody can follow. For the rest of the discussion, I suggest we change it to Name and City, which makes it much easier to understand (and I should warn myself: I must suggest that right in the beginning of the discussion, never use variable names like value1, str1 etc.. my mistake, sorry).

With Name (value1) and City (value2) and SearchName (str1) and SearchCity (str2) it becomes this:

Dim Results = From vw In table1 _
    Where 
    ((SearchName Is Nothing AndAlso vw.Name Is Nothing)
    OrElse (SearchName IsNot Nothing AndAlso vw.Name = SearchName))
    AndAlso
    ((SearchCityIs Nothing AndAlso vw.City Is Nothing)
    OrElse (SearchCity IsNot Nothing AndAlso vw.City = SearchCity))
    Select vw.Name , vw.City 

                                              
1:
2:
3:
4:
5:
6:
7:
8:

Select allOpen in new window

 

by: MadIcePosted on 2009-08-21 at 07:28:49ID: 25152141

I knew as these post where continuing everything was getting mixed up. sorry about that.  To try to make it more clear, lets forget about what you're calling SearchName. That part is just a simple part that I have no issue with. in reality, I have other parts to my where clause. I just cant get the syntax write for the searchCity. I'm going to look more closely at your last example and try it. I think this example will work just reading it. At least for the part I'm having an issue with. I was working on creating two strings for the query and calling the one I need but I need to create a union and that causes other issues.

 

by: abelPosted on 2009-08-21 at 08:21:03ID: 25152736

Ok. Just make sure you use that AndAlso and OrElse abundantly. It prevents problems with accessing nulls (though that was not the real issue here). Also, if things get tricky, you can extract them and put them in a function which returns a boolean. But that you knew already, I believe ;)

 

by: MadIcePosted on 2009-08-21 at 14:10:32ID: 31615091

abel, that does the trick. thanks alot. also thanks for putting up with my confusing questions.  

 

by: abelPosted on 2009-08-21 at 14:18:45ID: 25155931

Glad we got it solved in the end! Tx for the followup and the pts :)

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...