Effieciently validate multiple DataRows with return early option
The if condition  

if( batch == null || batch?.Count() == 0 ) { logger.Error( MSG_NO_DATAROWS ); return false; }  


has some flaws:  


the Null-Conditional operator ? on batch?.Count() == 0 isn't needed, because you already check for batch == null  
If the passed IEnumerable&lt;DataRow&gt; isn't a Collection&lt;T&gt; the IEnumerable&lt;DataRow&gt; will be enumerated completely for calculating the Count.
Assume you have millions of items in that IEnumerable&lt;T&gt; guess how much time it takes to iterate twice (once for Count() and once for the foreach).  
Having multiple statements in a single line reduces the readability of the code.


A better way would be to use the Any() method like so  

if( batch == null || !batch.Any()) 
{ 
    logger.Error( MSG_NO_DATAROWS ); 
    return false; 
}