Solved

# LINQ syntax - where condition?

Posted on 2013-01-15
443 Views
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
Question by:knowlton
• 11
• 4
• 4

LVL 22

Expert Comment

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

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));
``````

0

LVL 5

Author Comment

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

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

you can combine those two where clauses into one with &&
0

LVL 5

Author Comment

null means "has never had a value" right?

[EDIT]

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

LVL 74

Expert Comment

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));
``````
0

LVL 5

Author Comment

>>  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

>>>>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

LVL 5

Author Comment

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));
``````

What am I missing?
0

LVL 74

Expert Comment

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);
``````
0

LVL 5

Author Comment

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

It can matter, but I don't think it does in this case.

What is the type of BidAmt?
0

LVL 5

Author Comment

>>>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

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.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
InnerException:
``````
0

LVL 74

Accepted Solution

käµfm³d   👽 earned 250 total points
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

p_davis earned 250 total points
Of it is nullable (?) Then check the hasvalue property on it in the vlauses
0

LVL 5

Author Comment

>>>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;
}
``````
0

LVL 5

Author Closing Comment

Nice work, all of you!
0

## Featured Post

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…