Basicamente, quando faço a consulta a seguir, se nenhum lead for correspondido, a consulta a seguir gera uma exceção. Nesse caso, eu preferiria que a soma igualasse 0, em vez de uma exceção ser lançada. Isso seria possível na própria consulta - quero dizer, em vez de armazenar a consulta e verificar query.Any()
?
double earnings = db.Leads.Where(l => l.Date.Day == date.Day
&& l.Date.Month == date.Month
&& l.Date.Year == date.Year
&& l.Property.Type == ProtectedPropertyType.Password
&& l.Property.PropertyId == PropertyId).Sum(l => l.Amount);
c#
.net
entity-framework
John Mayer
fonte
fonte
Where
não retornarianull
se não encontrasse nenhum registro, retornaria uma lista de zero itens. Qual é a exceção?SQL
é gerado.Amount
não é realmentenull
, é realmente um problema envolvendo como ele lida com zero resultados. Dê uma olhada na resposta que foi fornecida.decimal
, seu código deve ser usadodecimal
. Esqueça que você já conheceufloat
edouble
em sua carreira de programador até o dia em que alguém lhe disser para usá-los, para estatísticas ou luminância estelar ou os resultados de um processo estocástico ou carga de um elétron! Até então, você está fazendo errado .Respostas:
Tente alterar sua consulta para isso:
Dessa forma, sua consulta selecionará apenas o
Amount
campo. Se a coleção estiver vazia, ele retornará um elemento com o valor de0
e a soma será aplicada.fonte
Sum
eles no lado do servidor, em vez de no lado do banco de dados? A solução da imo 2kay é mais ideal, pelo menos mais semanticamente correta.IQueryable<T>
corrente pára (normalmente quando você chamaToList
,AsEnumerable
, etc .. e, neste casoSum
).Sum
é um método conhecido e tratado pelo EF Queryable Provider e gerará a instrução SQL relacionada.SELECT SUM(a.Amount) FROM (SELECT Amount FROM Leads WHERE ...) AS a
vez de apenasSELECT SUM(Amount) FROM Leads
. Além disso, a subconsulta possui uma verificação nula adicional e uma junção externa estranha com uma tabela de linha única.DefaultIfEmpty
não há suporte para vários provedores LINQ; portanto, você precisará inserir umToList()
ou algo semelhante antes de usá-lo nesses casos, para que ele seja aplicado no cenário LINQ to Objects .Eu prefiro usar outro hack:
fonte
Tente isso em vez disso, é mais curto:
fonte
Isso é vitória para mim:
Na minha tabela LOGIN, no campo NUMBEROFLOGINS, alguns valores são NULL e outros têm um número INT. Soma aqui o total de NUMBEROFLOGINS de todos os usuários de uma corporação (cada ID).
fonte
Experimentar:
A consulta " SELECT SUM ([Amount]) " "retornará NULL para a lista vazia. Mas se você usar o LINQ, espera que o " Sum (l => l.Amount) " retorne duas vezes e não permita que você use o operador " ?? " para definir 0 para a coleção vazia.
Para evitar essa situação, você precisa fazer o LINQ esperar " dobrar? ". Você pode fazer isso lançando " (double?) L.mount ".
Não afeta a consulta ao SQL, mas faz o LINQ funcionar para coleções vazias.
fonte
fonte
ToList
aqui se tudo que você quer é a soma. Isso retornará o conjunto de resultados inteiro (apenasAmount
para cada registro neste caso) na memória e, em seguida,Sum()
nesse conjunto. Muito melhor usar outra solução que faça o cálculo via SQL Server.