2012-01-18 53 views
0

在我的Windows Phone Mango應用程序中,我有一堆複選框,每個複選框都對應一週的某一天。我想篩選我查詢哪些複選框被選中的數據。下面是我想出的,但我覺得有更好的解決方案:方法'布爾包含(System.DayOfWeek)'不支持轉換爲SQL

聲明覆選框在XAML:

public MainPage() 
    { 
     InitializeComponent(); 

     LayoutRoot.DataContext = this; 

     // This is grossly imperative. Can it be done in XAML? 
     MonCheckbox.Tag = DayOfWeek.Monday; 
     TueCheckbox.Tag = DayOfWeek.Tuesday; 
     WedCheckbox.Tag = DayOfWeek.Wednesday; 
     ThurCheckbox.Tag = DayOfWeek.Thursday; 
     FriCheckbox.Tag = DayOfWeek.Friday; 
     SatCheckbox.Tag = DayOfWeek.Saturday; 
     SunCheckbox.Tag = DayOfWeek.Sunday; 

     // ... 
    } 

維護:每個複選框每天

  <CheckBox Content="Mon" x:Name="MonCheckbox" Checked="DayCheckbox_Tap" Unchecked="DayCheckbox_Tap"/> 
      <CheckBox Content="Tue" x:Name="TueCheckbox" Grid.Column="1" Checked="DayCheckbox_Tap" Unchecked="DayCheckbox_Tap" /> 
      <CheckBox Content="Wed" x:Name="WedCheckbox" Grid.Column="2" Checked="DayCheckbox_Tap" Unchecked="DayCheckbox_Tap" /> 
      <CheckBox Content="Thur" x:Name="ThurCheckbox" Grid.Row="1" Checked="DayCheckbox_Tap" Unchecked="DayCheckbox_Tap" /> 
      <CheckBox Content="Fri" x:Name="FriCheckbox" Grid.Row="1" Grid.Column="1" Checked="DayCheckbox_Tap" Unchecked="DayCheckbox_Tap" /> 
      <CheckBox Content="Sat" x:Name="SatCheckbox" Grid.Row="1" Grid.Column="2" Checked="DayCheckbox_Tap" Unchecked="DayCheckbox_Tap" /> 
      <CheckBox Content="Sun" x:Name="SunCheckbox" Grid.Row="2" Grid.Column="0" Checked="DayCheckbox_Tap" Unchecked="DayCheckbox_Tap" /> 

助理當前選定日期的集合:

ICollection<DayOfWeek> _selectedDays = new Collection<DayOfWeek>(); 

    private void DayCheckbox_Tap(object sender, RoutedEventArgs e) 
    { 
     CheckBox checkbox = (CheckBox)sender; 
     if (_selectedDays.Contains((DayOfWeek)checkbox.Tag)) 
     { 
      _selectedDays.Remove((DayOfWeek)checkbox.Tag); 
     } 
     else 
     { 
      _selectedDays.Add((DayOfWeek)checkbox.Tag); 
     } 

     refreshCheckinData(); 
    } 

問題出現在我刷新時在隨即出現給用戶的數據:

private void refreshCheckinData() 
    { 
     Checkins.Clear(); 
     Checkins.AddAll(from checkin in checkinData.Items 
         where _selectedDays.Contains(checkin.DateTime.DayOfWeek) 
         select checkin); 
    } 

public static class ExtensionMethods 
{ 
    public static void AddAll<T>(this ICollection<T> dest, IEnumerable<T> source) 
    { 
     if (dest == null) 
     { 
      throw new ArgumentNullException("dest"); 
     } 

     foreach (T t in source) 
     { 
      dest.Add(t); 
     } 
    } 
} 

當代碼試圖在AddAll()遍歷source,會出現以下異常:

Method 'Boolean Contains(System.DayOfWeek)' has no supported translation to SQL." System.Exception {System.NotSupportedException} 

我怎樣才能解決這個問題?爲什麼Contains需要SQL轉換?是否有更好的方法來處理整個事情,使用更多的聲明式XAML和更少的命令式代碼?

更新:我試圖改變查詢:

現在我得到以下錯誤:

"Local sequence cannot be used in LINQ to SQL implementations of query operators except the Contains operator." System.Exception {System.NotSupportedException} 

_selectedDays在內存中定義。爲什麼需要將其轉換爲SQL?

回答

0

您的原始查詢已關閉。我認爲ICollection上的Contains()方法正在影響SQL轉換器 - 我需要仔細檢查代碼才能確定。

您可以解決此通過強制Enumerable.Contains的選擇()擴展方法,通過改變你的代碼如下:

private void refreshCheckinData() 
{ 
    Checkins.Clear(); 
    Checkins.AddAll(from checkin in checkinData.Items 
        where _selectedDays.AsEnumerable().Contains(checkin.DateTime.DayOfWeek) 
        select checkin); 
} 

Enumerable.Contains(T)的擴展方法轉化爲IN子句數據庫。

結果查詢將是這樣的:。 SELECT [T 0] [重點],[T 0] [日] FROM [東西] AS [T 0] WHERE [T 0] [日] IN( @ p0,@ p1)

0

如果我沒有理解它正確,那麼你想所有選定的日子添加到您的「Chekings」爲什麼不試試這個代碼,我認爲這將解決您的問題,現在並回答我必須想其他問題關於他們有點做一些研究。 :)

foreach(var day in _selectedDays) 
{ 
Checkins.AddAll(from checkin in checkinData.Items 
        where checkin.DateTime.DayOfWeek == day 
        select checkin); 
} 

將不得不測試這一個我不知道它是否工作或如果它甚至是有效的。

from checkin in checkinData.Items 
join sdays in _selectedDays on checkin.DateTime.DayOfWeek == sdays 
select checkin 
+0

嗯,不完全。我想查詢所有簽入日期已滿的簽入。我不想自己添加一週的日子。 – 2012-01-18 20:09:17

+0

這是存儲在chekinData? – BigL 2012-01-18 20:17:58

+0

@Rosarch更新了我的答案,我希望這是你正在尋找我知道這不是一個非常優雅的方式來做到這一點。 – BigL 2012-01-18 20:24:59