我已經得到了很多醜陋的代碼看起來像這樣:你會如何重構這個LINQ代碼?
if (!string.IsNullOrEmpty(ddlFileName.SelectedItem.Text))
results = results.Where(x => x.FileName.Contains(ddlFileName.SelectedValue));
if (chkFileName.Checked)
results = results.Where(x => x.FileName == null);
if (!string.IsNullOrEmpty(ddlIPAddress.SelectedItem.Text))
results = results.Where(x => x.IpAddress.Contains(ddlIPAddress.SelectedValue));
if (chkIPAddress.Checked)
results = results.Where(x => x.IpAddress == null);
...etc.
results
是IQueryable<MyObject>
。
想法是,對於這些無數的下拉菜單和複選框中的每一個,如果下拉列表中選擇了某些內容,則用戶希望匹配該項目。如果選中該複選框,則用戶特別需要那些字段爲空或空字符串的記錄。 (UI不允許同時選擇兩者。)這一切都增加了LINQ表達式,在我們添加完所有條件後,最後執行該表達式。
它似乎喜歡,就必須有某種方式拉出一個Expression<Func<MyObject, bool>>
或兩個,這樣我可以把重複部分的方法,只是在傳遞什麼樣的變化。我在其他地方做過,但是這組代碼讓我感到困惑。 (另外,我想避免使用「動態LINQ」,因爲如果可能,我想保持類型安全。)任何想法?
請記住,這是LINQ to SQL(我沒有在問題中說過,但它是其中一個標籤)。我想過濾發生在數據庫端,而不是客戶端。 – 2008-09-30 01:42:39