Rouzbeh Zarandi
Rouzbeh Zarandi

Reputation: 1082

Entity Framework if statement inside select

I have a problem in generating an Entity Framework query and not okay with linq style one :.....

This is my attempt:

var query = db.table
              .Where(x => x.colA == 1)
              .GroupBy(x => new {x.min,x.max})
              .Select(y => if(y.key.min==0 && y.key.max==0)
                              { " unchanged " } 
                           else 
                              { y.key.min.tostring()+" "+y.key.max.tostring() })
              .ToList()

I want to get "unchanged" string, if both value ofmin and max are zero, otherwise concat them

Upvotes: 1

Views: 12124

Answers (4)

Harald Coppoolse
Harald Coppoolse

Reputation: 30474

Apparently all elements in your table have properties min and max

After GroupBy(x=> new {x.min,x.max}) you'll have a sequence of groups, where each group has a key {min, max}, all elements in the group have this value for their min and max properties.

After the GroupBy, you take every group, and from every group you'll select exactly one string. You get rid of the element of the group.

The string that you select depends on the key of the group: if the key = {0, 0} you select the string "unchanged", else you select the string:

y.key.min.tostring()+" "+y.key.max.tostring()

The result is a list of strings, something like:

 "3 7",
 "4 10,
 "unchanged",
 "2 8",

Are you sure you want this?

In that case you won't need the GroupBy. Distinct will be simpler and faster

List<string> result = db.table
   .Where(tableRow => tableRow.colA == 1)
   .Select(tableRow => tableRow.min==0 && tableRow.max==0 
         ? " unchanged " 
         : tableRow.min.tostring()+" "+tableRow.max.tostring())
   // from here you have a sequence of strings
   // get rid of duplicates:
   .Distinct()
   .ToList();

Upvotes: 2

Jacky
Jacky

Reputation: 3259

For this specific case, you can use Conditional Operator (?:)

var query = db.table
            .Where(x=> x.colA == 1)
            .GroupBy(x=> new {x.min,x.max})
            .Select(y=> (y.Key.min == 0 && y.Key.max == 0) ? " unchanged" : (y.Key.min.ToString()+" "+y.Key.max.ToString()))
            .ToList();

Upvotes: 1

Kostis
Kostis

Reputation: 963

Sorry I can't try it right now, but i think this should work

var query = db.table
   .Where(x=> x.colA == 1)
   .GroupBy(x=> new {x.min,x.max})
   .Select(y=>  {if(y.key.min==0 && y.key.max==0)
                { 
                    " unchanged " 
                } else 
                { 
                    y.key.min.tostring()+" "+y.key.max.tostring(); 
                } return y;})
    .ToList()

Upvotes: 0

Tim Schmelter
Tim Schmelter

Reputation: 460208

Use the conditional operator

// ...

.Select(y=> y.key.min==0 && y.key.max==0 
             ? " unchanged " 
             : y.key.min.tostring()+" "+y.key.max.tostring())
// ...

Upvotes: 4

Related Questions