Solved

LINQ syntax - where condition?

Posted on 2013-01-15
19
443 Views
Last Modified: 2013-01-15
decimal dec = Convert.ToDecimal(_repairBids.Select(o => o.BidAmt == null ? 0 : o.BidAmt).Sum(o => o));


if I wanted to filter this by "o.Status = "Approved" so that only bid amounts that are approved get totalled...what would be the syntax?
0
Comment
Question by:knowlton
  • 11
  • 4
  • 4
19 Comments
 
LVL 22

Expert Comment

by:p_davis
Comment Utility
decimal dec = Convert.ToDecimal(_repairBids.Where(o.Status == "Approved").Select(o => o.BidAmt == null ? 0 : o.BidAmt).Sum(o => o));
0
 
LVL 5

Author Comment

by:knowlton
Comment Utility
That looks correct to me.

If you don't mind helping me out, I keep getting:

value cannot be null

I tried to make provisions for this by adding this:

o.BidAmt == null ? 0 : o.BidAmt

but I must either be doing that wrong or the problem is elsewhere...


decimal dec = Convert.ToDecimal(_repairBids.Where(o => o.BidStatus == "Approved").Select(o => o.BidAmt == null ? 0 : o.BidAmt).Sum(o => o));

Open in new window



cannot be null
0
 
LVL 5

Author Comment

by:knowlton
Comment Utility
Does this make sense?


decimal dec = Convert.ToDecimal(_repairBids.Where(o => o.BidStatus == "Approved").Where(o => o.BidAmt != null).Select(o => o.BidAmt).Sum(o => o));


can you do multiple "WHERE"'s like that?
0
 
LVL 22

Expert Comment

by:p_davis
Comment Utility
do you know what is actually null?

you can try to check every level of that  object for null

o=> o == null  && ....?

also is it possible that the bidstatus is null? you might want to check for null in the where clause as well.
0
 
LVL 22

Expert Comment

by:p_davis
Comment Utility
you can combine those two where clauses into one with &&
0
 
LVL 5

Author Comment

by:knowlton
Comment Utility
null means "has never had a value" right?

[EDIT]

In other words, null is not 0, "0" or ""
0
 
LVL 74

Expert Comment

by:käµfm³d 👽
Comment Utility
I thought BidAmt was a string? You can't mix types when using the conditional operator. Change the zero to a string:

decimal dec = Convert.ToDecimal(_repairBids.Where(o.Status == "Approved").Select(o => o.BidAmt == null ? "0" : o.BidAmt).Sum(o => o));

Open in new window

0
 
LVL 5

Author Comment

by:knowlton
Comment Utility
>>  also is it possible that the bidstatus is null?

I supposed it could happen.  Better to be safe.  I'll check on that...
0
 
LVL 5

Author Comment

by:knowlton
Comment Utility
>>>>I thought BidAmt was a string? You can't mix types when using the conditional operator. >>>>Change the zero to a string:


in one result it WAS indeed a string.


in another it is an actual decimal.


Let me recheck that....
0
How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

 
LVL 5

Author Comment

by:knowlton
Comment Utility
This line compiles fine, but at runtime I still get the error:  value cannot be null

decimal dec = Convert.ToDecimal(_repairBids.Where(o => o.BidStatus == "Approved" && o.BidStatus != null && o.BidAmt != null).Select(o => o.BidAmt).Sum(o => o));

Open in new window



What am I missing?
0
 
LVL 74

Expert Comment

by:käµfm³d 👽
Comment Utility
For readability's sake, I'd suggest breaking that logic up a bit (once the issue is corrected):

decimal dec;

var sum = _repairBids.Where(o.Status == "Approved")
                     .Select(o => o.BidAmt ?? "0")
                     .Sum(o => o);

dec = Convert.ToDecimal(sum);

Open in new window

0
 
LVL 5

Author Comment

by:knowlton
Comment Utility
Does it matter where the WHERE is called in the chain?

For example, does it matter if the WHERE is before the SELECT in LINQ?
0
 
LVL 74

Expert Comment

by:käµfm³d 👽
Comment Utility
It can matter, but I don't think it does in this case.

What is the type of BidAmt?
0
 
LVL 5

Author Comment

by:knowlton
Comment Utility
>>>What is the type of BidAmt?


It is:

decimal?

which I interpret to mean it can be a decimal value or a null value returned
0
 
LVL 5

Author Comment

by:knowlton
Comment Utility
NOTE:

The exception message, if it helps at all:

System.ArgumentNullException was unhandled by user code
  Message=Value cannot be null.
Parameter name: source
  Source=System.Core
  ParamName=source
  StackTrace:
       at System.Linq.Enumerable.Where[TSource](IEnumerable`1 source, Func`2 predicate)
       at Reo.ContentControls.RepairBidFormSummary.ReturnTot() in C:\R13\Reo\ContentControls\RepairBidFormSummary.ascx.cs:line 81
       at Reo.ContentControls.Preservation.FillRepairBid() in C:\R13\Reo\ContentControls\Preservation.ascx.cs:line 266
       at Reo.ContentControls.Preservation.FillPg() in C:\R13\Reo\ContentControls\Preservation.ascx.cs:line 113
       at Reo.ContentControls.Preservation.Page_Load(Object sender, EventArgs e) in C:\R13\Reo\ContentControls\Preservation.ascx.cs:line 68
       at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
       at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
       at System.Web.UI.Control.OnLoad(EventArgs e)
       at System.Web.UI.Control.LoadRecursive()
       at System.Web.UI.Control.LoadRecursive()
       at System.Web.UI.Control.LoadRecursive()
       at System.Web.UI.Control.LoadRecursive()
       at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
  InnerException: 

Open in new window

0
 
LVL 74

Accepted Solution

by:
käµfm³d   👽 earned 250 total points
Comment Utility
which I interpret to mean it can be a decimal value or a null value returned
Correct.

Are you certain that _repairBids is not null when you get to that line?
0
 
LVL 22

Assisted Solution

by:p_davis
p_davis earned 250 total points
Comment Utility
Of it is nullable (?) Then check the hasvalue property on it in the vlauses
0
 
LVL 5

Author Comment

by:knowlton
Comment Utility
>>>Are you certain that _repairBids is not null when you get to that line?

Good news!!

Yes...this was the case.  _repairBids was null.  The entire thing.

I guess I didn't realize I needed to re-get everything from the data context.


Here is my final code:


 public decimal ReturnTot()
        {
            decimal dec = 0;

            using (PreservationDataContext dc = new PreservationDataContext())
            {
                _repairBids = dc.Pres_RepairBidFormSummary_Get(this.RepairBidFormID, this.RepairBidFormSID).ToList<Pres_RepairBidFormSummary_GetResult>();

                if (_repairBids != null)
                {
                    dec = Convert.ToDecimal(_repairBids.Where(o => o.BidStatus == "Approved" && o.BidStatus != null && o.BidAmt != null).Select(o => o.BidAmt).Sum(o => o));
                }
            }
            
            return dec;            
        }

Open in new window

0
 
LVL 5

Author Closing Comment

by:knowlton
Comment Utility
Nice work, all of you!
0

Featured Post

Maximize Your Threat Intelligence Reporting

Reporting is one of the most important and least talked about aspects of a world-class threat intelligence program. Here’s how to do it right.

Join & Write a Comment

IntroductionWhile developing web applications, a single page might contain many regions and each region might contain many number of controls with the capability to perform  postback. Many times you might need to perform some action on an ASP.NET po…
More often than not, we developers are confronted with a need: a need to make some kind of magic happen via code. Whether it is for a client, for the boss, or for our own personal projects, the need must be satisfied. Most of the time, the Framework…
It is a freely distributed piece of software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages.
Excel styles will make formatting consistent and let you apply and change formatting faster. In this tutorial, you'll learn how to use Excel's built-in styles, how to modify styles, and how to create your own. You'll also learn how to use your custo…

744 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now