基于日期范围的SQLite Sum列

时间:2015-12-13 18:25:21

标签: c# sqlite winrt-xaml

晚上好,我有下表

public class SalesRecord
{
    [PrimaryKey, AutoIncrement]
    public int SalesRecID { get; set; }

    [Indexed]
    public string SalesRecDate { get; set; }
    public string SalesRecCustName { get; set; }
    public string SalesRecProdName { get; set; }
    public int SalesRecProdQty { get; set; }
    public double SalesRecProdPrice { get; set; }
    public double SalesRecTotalPrice { get; set; }
}

我能够在XAML列表框中显示项目行。

<ListBox Name="listSalesRecord" Height="400" HorizontalAlignment="Left" Margin="0,5,0,0">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal" Height="18" VerticalAlignment="Top" >
                                <TextBlock Text="{Binding SalesRecID}" Margin="5,0,0,0" Width="30" FontSize="14"/>
                                <TextBlock Text="{Binding SalesRecDate}" Margin="5,0,0,0" Width="80" FontSize="14"/>
                                <TextBlock Text="{Binding SalesRecCustName}" Margin="5,0,0,0" Width="80" FontSize="14"/>
                                <TextBlock Text="{Binding SalesRecProdName}" Margin="5,0,0,0" Width="80" FontSize="14"/>
                                <TextBlock Text="{Binding SalesRecProdQty}" Margin="5,0,0,0" Width="60" FontSize="14"/>
                                <TextBlock Text="{Binding SalesRecProdPrice, Converter={StaticResource Converter}, ConverterParameter=\{0:0.00\}}" Margin="5,0,0,0" Width="60" FontSize="14"/>
                                <TextBlock Text="{Binding SalesRecTotalPrice, Converter={StaticResource Converter}, ConverterParameter=\{0:0.00\}}" Margin="5,0,0,0" Width="60" FontSize="14"/>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

使用以下日期范围查询。没有问题,因为我知道yyyy-MM-dd格式。

private void btnSearchRecordDateRange_Click(object sender, RoutedEventArgs e)
    {
        var searchDateRange = conn.Query<SalesRecord>("SELECT * FROM SalesRecord WHERE date(SalesRecDate) BETWEEN date('" + tbxCDPFrom.Text + "') AND date('" + tbxCDPTo.Text + "')");

        listSalesRecord.ItemsSource = searchDateRange;
    }

但现在我想根据日期范围计算产品数量总和,我希望使用相同的查询在文本框中显示,我所做的唯一更改是将SELECT * FROM替换为SELECT SUM(SalesRecProdQty) FROM 。但是这个相同的查询字符串未能给我所需的总和。

private void btnSearchSumDateRange_Click(object sender, RoutedEventArgs e)
   {
        var searchSumProdQty = conn.Query<SalesRecord>("SELECT SUM(SalesRecProdQty) FROM SalesRecord WHERE date(SalesRecDate) BETWEEN date('" +   tbxCDPFrom.Text + "') AND date('" + tbxCDPTo.Text + "')");

        tbxSearchQty.Text = searchSumProdQty.ToString();
   }

我在文本框中收到此错误消息:

System.Collections.Generic.List`1[SalePad.Models.SalesRecord]

有人能告诉我哪里做错了。

SELECT *工作,但SELECT SUM(SalesRecProdQty)失败,即使他们使用相同的查询字符串。

我使用的是SQLite.Net-PCL,我在WinRT上使用的是UWP,而不是WPF。

2 个答案:

答案 0 :(得分:1)

很抱歉给人们带来麻烦,但我找到了答案

要获得SUM(SalesRecProdQty)你必须这样做

var searchdaterange = conn.Query<SalesRecord>("SELECT * FROM SalesRecord WHERE date(SalesRecDate) BETWEEN date('"+ tbxCDPFrom.Text + "') AND date('"+ tbxCDPTo.Text + "')");

        var sumProdQty = searchdaterange.AsEnumerable().Sum(o => o.SalesRecProdQty);
        tbxSearchQty.Text = sumProdQty.ToString();

如果有人可以解释为什么我被迫使用AsEnumerable.Sum(o => o.SalesRecProdQty);背后的逻辑,我会很感激,因为原始语法在SQL Fiddle中起作用但它拒绝使用我的程序。

答案 1 :(得分:1)

选择特定的列时遇到相同的问题,阅读器不返回任何行,这与使用sum()时相同。选择*可以与完全相同的查询配合使用,我的所有查询都可以在DB Browser For SQLite中使用,而不能在c#中使用。

在C#中使用SQLite时,您需要在查询中选择的列中有一个索引列,例如

SELECT table.primaryKey, table.someOtherColumn FROM table

或者您的情况

SELECT salesRecord.primaryKey, SUM(SalesRecProdQty) FROM SalesRecord WHERE date(SalesRecDate) BETWEEN date('" +   tbxCDPFrom.Text + "') AND date('" + tbxCDPTo.Text + "')

选择* /全部有效的原因是因为它正在选择索引表的​​表。