SLoret
SLoret

Reputation: 1541

What if you don't need a parameter when querying with Dapper?

I have one query that does a count/group by where I don't need a parameter (there is no where clause).

What is the syntax to run a parameterless query with dapper?

var _results = _conn.Query<strongType>("Select Count(columnA) as aCount, ColumnB, ColumnC from mytable group by ColumnB, ColumnC");

does not work.

I've tried it a few different ways but I still keep getting "ArgumentNullException was unhandled by user code".

Tried to figure it out myself, searched all over and I'm giving up. Thanks in advance.

Edit: Below is the line of code from SqlMapper.cs that throws the error. It's line 1334

il.Emit(OpCodes.Newobj, typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null));

The error details: Value cannot be null. Parameter name: con

Upvotes: 0

Views: 5041

Answers (4)

ErikE
ErikE

Reputation: 50241

This error can occur because a property you're trying to set in your return object is get-only. Dapper, of course, requires being able to set all properties. You might consider having a separate database DTO object that then gets converted to your properly immutable domain object after reading from the database.

Change this:

public string MyProperty { get; }

to this:

public string MyProperty { get; set; }

Upvotes: 0

plurral
plurral

Reputation: 1

Value cannot be null. Parameter name: con

This is error is thrown by several dynamic ORMs including Dappper, PetaPoco and Massive but it's usually the same problem: Make sure you're using the [Ignore] attribute on the properties you don't want to include. This includes properties inherited from base classes. The error is useless but that's what it means.

Upvotes: 0

Sam Saffron
Sam Saffron

Reputation: 131112

Mapping a single result back works just fine:

var a = cnn.Query<int>("select 1").Single()
// a is 1

You may face trouble if somehow your query returns no results, for example:

select count(Id) from 
(
select top 0 1 as Id, 2 as Title
) as X
group by Title

return 0 results, so doing a Single on an empty result set is not going to work.

Upvotes: 4

Yahia
Yahia

Reputation: 70369

try

var _results = _conn.Query("Select columnB, Count(columnA) C from mytable group by columnB");

int ColumnB = ((int)_results[0].ColumnB);
int C = ((int)_results[0].C);

Upvotes: 0

Related Questions