7

We're having a discussion about using Equals or == on an int comparison in a LINQ query. We're using EF4.1 Code First. What is better?

var query = context.Boodschappen
                   .Where(b => b.BoodschapID == id).FirstOrDefault();

or:

var query = context.Boodschappen
                   .Where(b => b.BoodschapID.Equals(id)).FirstOrDefault();

And why?

Kees C. Bakker
  • 32,294
  • 27
  • 115
  • 203

2 Answers2

13

For Linq To Sql, you want neither. Instead, use Object.Equals: .Where(b => Object.Equals(b.BoodschapID, id)

Why? Because of a Bug in the SQL Generator if id happens to be a nullable uniqueidentifier. If using b.BoodschapID.Equals(id) or b.BoodschapID == id and b.BoodschapID happens to be a nullable Guid, the generated SQL will not be WHERE BoodschapID IS NULL but rather WHERE BoodschapID = @p0 which will not return any results.

I know for sure that EF used to have the same bug. No idea if it's solved yet. You can find more details in this question, just be aware that some of the answers generate horrendous SQL.

Apart from that, there is no difference between Equals and == in Linq To SQL that I'm aware of.

Community
  • 1
  • 1
Michael Stum
  • 177,530
  • 117
  • 400
  • 535
  • That bug only seems to be present in EF. I use Linq2SQL all the time like that with no issue. – leppie Nov 12 '11 at 16:29
  • @leppie I stumbled across it when I ran into exactly that problem with Linq To SQL on .net 4.0 :( See the linked question. – Michael Stum Nov 12 '11 at 16:30
  • Interesting. Never had that problem. What side was the nullable? – leppie Nov 12 '11 at 16:31
  • 1
    BTW, no need to do `Object.Equals(...)`, `Equals(...)` works just as well. – leppie Nov 12 '11 at 16:32
  • I see now how that 'bug' can occur. Not that it would happen often, but I guess there are occasions :) – leppie Nov 12 '11 at 16:34
  • 1
    @leppie Both sides. Essentially: `public SomeObj Get(Guid? someId) { return (from row in db.GetTable() where row.SomeID == someId select row.AsBusiness()).FirstOrDefault(); }` would trigger it. `row.SomeID.Equals(id)` had the same issue. `where Equals(row.SomeID,someId)` fixed it without generating terrible SQL. The bug does not occur with `where row.SomeID == null`. Essentially the Expression Analyzer does not recognize that someID is NULL and treats it as a normal parameter. – Michael Stum Nov 12 '11 at 16:35
0

I 'prefer' the former. It works on nullable properties too.

leppie
  • 115,091
  • 17
  • 196
  • 297