【问题标题】:how to access each element of a query variable如何访问查询变量的每个元素
【发布时间】:2016-06-18 16:02:01
【问题描述】:

我是 C# 和 WPF 的新手。假设我有一张桌子。该表有两个字段:“firstName”和“birthDate”。我写了一个查询来获取“生日”记录,然后我想在数据网格上显示它。但在此之前,我想用一个函数将“公历日期”更改为“jalali 日期”。

在 C# 中:

var searchQueryOfDateAndTime = (from b in FaceDB.tblCameras
                                        join c in FaceDB.tblTraffics
                                       on b.Camera_Id equals c.Camera_Id
                                       join a in FaceDB.tblknownPeoples
                                       on c.IdNumber equals a.IdNumber

                                       where
                                       (
                                           string.Compare(c.EntryDate.ToString(), miladiFromDate.ToString()) >= 0
                                           &&
                                           string.Compare(c.EntryDate.ToString(), miladiToDate.ToString()) <= 0
                                       )
                                       where
                                       (
                                           string.IsNullOrEmpty(timFromHour.Text.ToString())
                                           ||
                                           string.Compare(c.EntryTime.ToString(), timFromHour.Text.ToString()) >= 0
                                           &&
                                           string.IsNullOrEmpty(timToHour.Text.ToString())
                                           ||
                                           string.Compare(c.ExitTime.ToString(), timToHour.Text.ToString()) <= 0
                                       )

                                       select new { a.Name, a.Family, EntryDate = Georgian2Jalali(c.EntryDate), c.EntryTime, a.Occupation, ExitDate = Georgian2Jalali(c.ExitDate), c.ExitTime, b.Camera_Name, c.PicAddress, a.FirstPicAddress, c.IdNumber, c.Camera_Id }).ToList();

        dgvFinalyReport.ItemsSource = searchQueryOfDateAndTime;

在 WPF 中:

<DataGrid x:Name="dgvFinalyReport" Height="431" Width="630" Canvas.Left="273" Canvas.Top="10" AutoGenerateColumns="False" CanUserDeleteRows="False">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="firstname" Binding="{Binding Name}" Width="78" />
                        <DataGridTextColumn Header="Last name" Binding="{Binding Family}" Width="78" />
                        <DataGridTextColumn Header="Entry date" Binding="{Binding EntryDate}" Width="78" />
                        <DataGridTextColumn Header="entry time" Binding="{Binding EntryTime}" Width="78" />
                        <DataGridTextColumn Header="exit date" Binding="{Binding ExitDate}" Width="78" />
                        <DataGridTextColumn Header="exit time" Binding="{Binding ExitTime}" Width="78" />
                        <DataGridTextColumn Header="occupation" Binding="{Binding Occupation}" Width="78" />
                        <DataGridTextColumn Header="Cam_Name" Binding="{Binding Camera_Name}" Width="78" />
                        <DataGridTextColumn Header="getface" Binding="{Binding PicAddress}" Width="78" />
                        <DataGridTextColumn Header="first face" Binding="{Binding FirstPicAddress}" Width="78" />
                    </DataGrid.Columns>
                </DataGrid>

【问题讨论】:

    标签: c# wpf linq


    【解决方案1】:

    另一种选择是创建一个转换器,该转换器采用公历日期并将其转换为 Jalali 日期:

    public class JalaliDateConverter : IValueConverter
    {
        public Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
           // Gregorian to Jalali conversion code
    
           return jalaliaDate;
        }
    
        public ConvertBack((object value, Type targetType, object parameter, CultureInfo culture)
        {
            // Jalali to Gregorian conversion code
    
            return gregorianDate;
        }
    }
    

    然后在你的 XAML 中你有:

    <DataGridTextColumn Header="Birth Day"
                        Binding="{Binding birthDate, Converter={StaticResource JalaliDateConverter}}"
                        Width="80" />
    

    请参阅 here 了解有关转换器的更完整教程。

    【讨论】:

    • 非常感谢,但是值、目标类型和参数是什么?此外,如何将此类与“选择”命令一起使用?
    • @Saeid - 这些参数是转换的标准参数。 value 是传入的值 - 在 Convert 情况下是公历日期,在 ConvertBack 情况下是 Jalali 日期。 parameter 将为空,因为您没有指定一个(您不需要它)。 targetType 是返回的类型。
    • 您不要将它与 select 命令一起使用。您将转换器类添加到您的项目,并将转换器添加到您的 XAML。
    【解决方案2】:

    由于new {} 创建了一个只读匿名类型,因此您无法循环查询并更新生日的值。相反,您可以直接更改该值:

    var query = from f in mydb.mytbl.AsEnumerable()
    select new
    {
        f.firstName,
        BirthDate = ConvertToJalali(f.BirthDate)
    };
    
    private DateTime ConvertToJalali(DateTime dt)
    {
     // your implementation here
    }
    

    注意:请注意使用AsEnumerable(),因为它将所有记录从数据库拖到内存中,但在您的特定情况下,它没有任何区别,因为您没有任何 where 子句。

    【讨论】:

    • 非常感谢,但我对您的建议有意见。 VS2015 给我这个异常信息:LINQ to Entities does not identify the method 'System.DateTime Georgian2Jalali(System.DateTime)' method, and this method cannot be translate into a store expression.
    • @Saeid 由于没有where子句,所以可以在内存中添加AsEnumerable()来做对象的创建,所以将mydb.mytbl替换为mydb.mytbl.AsEnumerable()。并不是说我们通常不会在有过滤条件的情况下这样做,但是在您指定的示例中它没有区别。
    • 但实际上我的真实代码中有一些 where 子句。由于我们对“评论”中的字符有限制,我已经编辑了上面的代码。问候
    猜你喜欢
    • 2020-05-24
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 2018-12-07
    相关资源
    最近更新 更多