简体   繁体   中英

Not understanding LINQ query

I am maintaining a project and have come across some code which I can't understand. LINQ query:

var toDraw = from tile in testArr.AsEnumerable()
             where tile.Item_Business_Unit != null ? 
             ((tile.Ending_Date >= DateTime.Now || tile.Ending_Date == DateTime.MinValue) && 
             ((tile.Sales_Code == null) || (tile.Sales_Code.ToString() == customerNumber) || 
             (tile.Sales_Code.ToString() == cpg)) && (tile.Unit_Price != 0)) : 
             ((tile.Ending_Date >= DateTime.Now || tile.Ending_Date == DateTime.MinValue) && 
             ((tile.Sales_Code == null) || (tile.Sales_Code.ToString() == customerNumber) || 
             (tile.Sales_Code.ToString() == cpg)) && (tile.Unit_Price != 0))
                             select tile;

From what I understand, from an array a tile is being selected which has the following criteria:

  • Ending date can be datetime.now or datetime.minvalue
  • Sales code can be null or can be equal to customer no or cpg
  • Unit price should be greater than 0

But I am not understanding why there is a conditional expression after tile.Item_Business_Unit since both of the conditions perform the same thing. So will the item be selected even if it has a null business unit? And does this work different from normal if/else operations?

Any suggestions would be very appreciated.

Are you being thrown by the shortcut notation?

x = (test_case) ? (true_part) : (false_part);

If test_case evaluates to true , you would have

true_part

Whereas if test_case evaluates to false , this expression would be evaluated

false_part

UPDATE:

As an FYI: The resulting test of both sides of that conditional expression above are equal, so that cryptic code is not even necessary.

You could replace that with this:

var toDraw = from tile in testArr.AsEnumerable()
    where 
    ((tile.Ending_Date >= DateTime.Now || tile.Ending_Date == DateTime.MinValue) &&
    ((tile.Sales_Code == null) || (tile.Sales_Code.ToString() == customerNumber) || (tile.Sales_Code.ToString() == cpg)) &&
    (tile.Unit_Price != 0)) 
    select tile;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM