When a query includes the use of Nullable<T>.HasValue and Nullable<T>.Value in the query, the SQL that we are generating doesn't generate a bit parameter for the use of HasValue, instead we have a T typed parameter that duplicates the value of the nullable object.
Have a query with this shape:
```
int receiptIdFilter = 20;
int? topicIdFilter = null;
DateTime dateFilter = DateTime.Now;
var query = context.Receipts.Include(r => r.Publication)
.Where(r => r.DateInserted < dateFilter
&& r.ReceiptId > receiptIdFilter
&& r.Publication.TopicId == (topicIdFilter.HasValue ? topicIdFilter.Value : 0)
&& r.Publication.ReceiptCount > 1)
.OrderBy(r => r.ReceiptId)
.Skip(50)
.Take(25);
```
The generated SQL looks like this:
```
SELECT TOP (25)
[Project1].[ReceiptId] AS [ReceiptId],
[Project1].[PublicationId] AS [PublicationId],
[Project1].[DateInserted] AS [DateInserted],
[Project1].[PublicationId1] AS [PublicationId1],
[Project1].[TopicId] AS [TopicId],
[Project1].[ReceiptCount] AS [ReceiptCount],
[Project1].[Name] AS [Name],
[Project1].[DateInserted1] AS [DateInserted1]
FROM ( SELECT [Project1].[ReceiptId] AS [ReceiptId], [Project1].[PublicationId] AS [PublicationId], [Project1].[DateInserted] AS [DateInserted], [Project1].[PublicationId1] AS [PublicationId1], [Project1].[TopicId] AS [TopicId], [Project1].[ReceiptCount] AS [ReceiptCount], [Project1].[Name] AS [Name], [Project1].[DateInserted1] AS [DateInserted1], row_number() OVER (ORDER BY [Project1].[ReceiptId] ASC) AS [row_number]
FROM ( SELECT
[Extent1].[ReceiptId] AS [ReceiptId],
[Extent1].[PublicationId] AS [PublicationId],
[Extent1].[DateInserted] AS [DateInserted],
[Extent2].[PublicationId] AS [PublicationId1],
[Extent2].[TopicId] AS [TopicId],
[Extent2].[ReceiptCount] AS [ReceiptCount],
[Extent2].[Name] AS [Name],
[Extent2].[DateInserted] AS [DateInserted1]
FROM [dbo].[Receipts] AS [Extent1]
INNER JOIN [dbo].[Publications] AS [Extent2] ON [Extent1].[PublicationId] = [Extent2].[PublicationId]
WHERE ([Extent1].[DateInserted] < @p__linq__0) AND ([Extent1].[ReceiptId] > @p__linq__1) AND ((([Extent2].[TopicId] = (CASE WHEN (@p__linq__2 IS NOT NULL) THEN @p__linq__3 ELSE 0 END)) AND ( NOT ((1 = 0) OR (CASE WHEN (@p__linq__2 IS NOT NULL) THEN @p__linq__3 ELSE 0 END IS NULL)))) OR (1 = 0)) AND ([Extent2].[ReceiptCount] > 1)
) AS [Project1]
) AS [Project1]
WHERE [Project1].[row_number] > 50
ORDER BY [Project1].[ReceiptId] ASC
/*
DateTime p__linq__0 = 8/20/2013 1:52:46 PM
Int32 p__linq__1 = 20
Int32 p__linq__2 = 4
Int32 p__linq__3 = 4
*/
```
However, if we take the use of Nullable<T>.HasValue outside of the query, the parameters get the expected types.
Assume a query with this shape:
```
int receiptIdFilter = 20;
int? topicIdFilter = 4;
bool hasvalue = topicIdFilter.HasValue;
DateTime dateFilter = DateTime.Now;
var query = context.Receipts.Include(r => r.Publication)
.Where(r => r.DateInserted < dateFilter
&& r.ReceiptId > receiptIdFilter
&& r.Publication.TopicId == (hasvalue ? topicIdFilter.Value : 0)
&& r.Publication.ReceiptCount > 1)
.OrderBy(r => r.ReceiptId)
.Skip(50)
.Take(25);
```
The generated SQL will now look like this:
```
SELECT TOP (25)
[Project1].[ReceiptId] AS [ReceiptId],
[Project1].[PublicationId] AS [PublicationId],
[Project1].[DateInserted] AS [DateInserted],
[Project1].[PublicationId1] AS [PublicationId1],
[Project1].[TopicId] AS [TopicId],
[Project1].[ReceiptCount] AS [ReceiptCount],
[Project1].[Name] AS [Name],
[Project1].[DateInserted1] AS [DateInserted1]
FROM ( SELECT [Project1].[ReceiptId] AS [ReceiptId], [Project1].[PublicationId] AS [PublicationId], [Project1].[DateInserted] AS [DateInserted], [Project1].[PublicationId1] AS [PublicationId1], [Project1].[TopicId] AS [TopicId], [Project1].[ReceiptCount] AS [ReceiptCount], [Project1].[Name] AS [Name], [Project1].[DateInserted1] AS [DateInserted1], row_number() OVER (ORDER BY [Project1].[ReceiptId] ASC) AS [row_number]
FROM ( SELECT
[Extent1].[ReceiptId] AS [ReceiptId],
[Extent1].[PublicationId] AS [PublicationId],
[Extent1].[DateInserted] AS [DateInserted],
[Extent2].[PublicationId] AS [PublicationId1],
[Extent2].[TopicId] AS [TopicId],
[Extent2].[ReceiptCount] AS [ReceiptCount],
[Extent2].[Name] AS [Name],
[Extent2].[DateInserted] AS [DateInserted1]
FROM [dbo].[Receipts] AS [Extent1]
INNER JOIN [dbo].[Publications] AS [Extent2] ON [Extent1].[PublicationId] = [Extent2].[PublicationId]
WHERE ([Extent1].[DateInserted] < @p__linq__0) AND ([Extent1].[ReceiptId] > @p__linq__1) AND ((([Extent2].[TopicId] = (CASE WHEN (@p__linq__2 = 1) THEN @p__linq__3 ELSE 0 END)) AND ( NOT ((1 = 0) OR (CASE WHEN (@p__linq__2 = 1) THEN @p__linq__3 ELSE 0 END IS NULL)))) OR (1 = 0)) AND ([Extent2].[ReceiptCount] > 1)
) AS [Project1]
) AS [Project1]
WHERE [Project1].[row_number] > 50
ORDER BY [Project1].[ReceiptId] ASC
/*
DateTime p__linq__0 = 8/20/2013 1:56:23 PM
Int32 p__linq__1 = 20
Boolean p__linq__2 = True
Int32 p__linq__3 = 4
*/
```
Have a query with this shape:
```
int receiptIdFilter = 20;
int? topicIdFilter = null;
DateTime dateFilter = DateTime.Now;
var query = context.Receipts.Include(r => r.Publication)
.Where(r => r.DateInserted < dateFilter
&& r.ReceiptId > receiptIdFilter
&& r.Publication.TopicId == (topicIdFilter.HasValue ? topicIdFilter.Value : 0)
&& r.Publication.ReceiptCount > 1)
.OrderBy(r => r.ReceiptId)
.Skip(50)
.Take(25);
```
The generated SQL looks like this:
```
SELECT TOP (25)
[Project1].[ReceiptId] AS [ReceiptId],
[Project1].[PublicationId] AS [PublicationId],
[Project1].[DateInserted] AS [DateInserted],
[Project1].[PublicationId1] AS [PublicationId1],
[Project1].[TopicId] AS [TopicId],
[Project1].[ReceiptCount] AS [ReceiptCount],
[Project1].[Name] AS [Name],
[Project1].[DateInserted1] AS [DateInserted1]
FROM ( SELECT [Project1].[ReceiptId] AS [ReceiptId], [Project1].[PublicationId] AS [PublicationId], [Project1].[DateInserted] AS [DateInserted], [Project1].[PublicationId1] AS [PublicationId1], [Project1].[TopicId] AS [TopicId], [Project1].[ReceiptCount] AS [ReceiptCount], [Project1].[Name] AS [Name], [Project1].[DateInserted1] AS [DateInserted1], row_number() OVER (ORDER BY [Project1].[ReceiptId] ASC) AS [row_number]
FROM ( SELECT
[Extent1].[ReceiptId] AS [ReceiptId],
[Extent1].[PublicationId] AS [PublicationId],
[Extent1].[DateInserted] AS [DateInserted],
[Extent2].[PublicationId] AS [PublicationId1],
[Extent2].[TopicId] AS [TopicId],
[Extent2].[ReceiptCount] AS [ReceiptCount],
[Extent2].[Name] AS [Name],
[Extent2].[DateInserted] AS [DateInserted1]
FROM [dbo].[Receipts] AS [Extent1]
INNER JOIN [dbo].[Publications] AS [Extent2] ON [Extent1].[PublicationId] = [Extent2].[PublicationId]
WHERE ([Extent1].[DateInserted] < @p__linq__0) AND ([Extent1].[ReceiptId] > @p__linq__1) AND ((([Extent2].[TopicId] = (CASE WHEN (@p__linq__2 IS NOT NULL) THEN @p__linq__3 ELSE 0 END)) AND ( NOT ((1 = 0) OR (CASE WHEN (@p__linq__2 IS NOT NULL) THEN @p__linq__3 ELSE 0 END IS NULL)))) OR (1 = 0)) AND ([Extent2].[ReceiptCount] > 1)
) AS [Project1]
) AS [Project1]
WHERE [Project1].[row_number] > 50
ORDER BY [Project1].[ReceiptId] ASC
/*
DateTime p__linq__0 = 8/20/2013 1:52:46 PM
Int32 p__linq__1 = 20
Int32 p__linq__2 = 4
Int32 p__linq__3 = 4
*/
```
However, if we take the use of Nullable<T>.HasValue outside of the query, the parameters get the expected types.
Assume a query with this shape:
```
int receiptIdFilter = 20;
int? topicIdFilter = 4;
bool hasvalue = topicIdFilter.HasValue;
DateTime dateFilter = DateTime.Now;
var query = context.Receipts.Include(r => r.Publication)
.Where(r => r.DateInserted < dateFilter
&& r.ReceiptId > receiptIdFilter
&& r.Publication.TopicId == (hasvalue ? topicIdFilter.Value : 0)
&& r.Publication.ReceiptCount > 1)
.OrderBy(r => r.ReceiptId)
.Skip(50)
.Take(25);
```
The generated SQL will now look like this:
```
SELECT TOP (25)
[Project1].[ReceiptId] AS [ReceiptId],
[Project1].[PublicationId] AS [PublicationId],
[Project1].[DateInserted] AS [DateInserted],
[Project1].[PublicationId1] AS [PublicationId1],
[Project1].[TopicId] AS [TopicId],
[Project1].[ReceiptCount] AS [ReceiptCount],
[Project1].[Name] AS [Name],
[Project1].[DateInserted1] AS [DateInserted1]
FROM ( SELECT [Project1].[ReceiptId] AS [ReceiptId], [Project1].[PublicationId] AS [PublicationId], [Project1].[DateInserted] AS [DateInserted], [Project1].[PublicationId1] AS [PublicationId1], [Project1].[TopicId] AS [TopicId], [Project1].[ReceiptCount] AS [ReceiptCount], [Project1].[Name] AS [Name], [Project1].[DateInserted1] AS [DateInserted1], row_number() OVER (ORDER BY [Project1].[ReceiptId] ASC) AS [row_number]
FROM ( SELECT
[Extent1].[ReceiptId] AS [ReceiptId],
[Extent1].[PublicationId] AS [PublicationId],
[Extent1].[DateInserted] AS [DateInserted],
[Extent2].[PublicationId] AS [PublicationId1],
[Extent2].[TopicId] AS [TopicId],
[Extent2].[ReceiptCount] AS [ReceiptCount],
[Extent2].[Name] AS [Name],
[Extent2].[DateInserted] AS [DateInserted1]
FROM [dbo].[Receipts] AS [Extent1]
INNER JOIN [dbo].[Publications] AS [Extent2] ON [Extent1].[PublicationId] = [Extent2].[PublicationId]
WHERE ([Extent1].[DateInserted] < @p__linq__0) AND ([Extent1].[ReceiptId] > @p__linq__1) AND ((([Extent2].[TopicId] = (CASE WHEN (@p__linq__2 = 1) THEN @p__linq__3 ELSE 0 END)) AND ( NOT ((1 = 0) OR (CASE WHEN (@p__linq__2 = 1) THEN @p__linq__3 ELSE 0 END IS NULL)))) OR (1 = 0)) AND ([Extent2].[ReceiptCount] > 1)
) AS [Project1]
) AS [Project1]
WHERE [Project1].[row_number] > 50
ORDER BY [Project1].[ReceiptId] ASC
/*
DateTime p__linq__0 = 8/20/2013 1:56:23 PM
Int32 p__linq__1 = 20
Boolean p__linq__2 = True
Int32 p__linq__3 = 4
*/
```