2012-07-20 106 views
2

我在Web表單中有四個按鈕,其目的是分別加載第一個,上一個,下一個和最後一個記錄。 他們通過將當前ID加載到表單中並根據需要進行操作。我正在使用Linq to SQL。 下面是我用於NEXT記錄的代碼,如果我想按ID加載下一條記錄,它的功能正常。LINQ中的動態查詢

var dx = new DataModelDataContext(); 
List<Dog> dogList = dx.Dogs.AsEnumerable().ToList(); 

try 
{ 
    return 
     dogList.SkipWhile(x => x.Id != dogId).Skip(1).FirstOrDefault().Id.ToString(
      CultureInfo.InvariantCulture); 
} 
catch 
{ 
    return null; 
} 

我重複一遍,對於前面的場景,這段代碼工作正常。

這種情況已經改變,我現在必須使用前面提到的按鈕檢索記錄,根據 下拉列表包含表單的屬性(名字,姓氏,性別等等)它不再是一個功能,其目的是通過ID找到下一條記錄 。

我正在考慮創建一個LoadNextRecord(searchParameter,TextboxValue),以便根據從下拉列表中指定的屬性 找到下一條記錄。

但是,是否可以動態指定要與哪些屬性比較我的數據?

例如:X => X [searchParameter] = textboxvalue

我知道這是可能的使用動態SQL ......不過,我想知道是否有可能使用LINQ。!。

+0

如果您的架構支持它,我喜歡@馬龍的回答,因爲它是最類型安全最好的。但是,如果您的搜索標準是基於用戶輸入的,那麼您可能會遇到魔術字符串。 – 2012-07-20 15:38:16

回答

1

您可以使用反射

 var dx = new DataModelDataContext(); 
     List<Dog> dogList = dx.Dogs.AsEnumerable().ToList(); 

     string PropetyToCheck = "MyProperty"; 

     PropertyInfo property = typeof(Dog).GetProperty(PropetyToCheck); 

     try 
     { 
      return 
       dogList.SkipWhile(x => property.GetValue(x, null) != dogId).Skip(1).FirstOrDefault().Id.ToString(
        CultureInfo.InvariantCulture); 
     } 
+0

這個答案有助於解決我的問題。謝謝!我必須添加到您的解決方案是,我必須訂購列表(由指定的屬性),以加載我需要的下一個記錄。 – DottoreM 2012-07-23 09:24:45

4

如果您使用Dynamic Linq則可能。通過downloading the sample here,您會在此路徑中的zip中找到一個文件:LinqSamples\DynamicQuery\DynamicQuery\dynamic.cs。通過添加該文件和正確的使用你有一些IQueryable擴展方法,允許你以字符串格式表示contines。在zip中有無數如何使用的例子。有了這個解決方案,你就可以堅持使用所謂的「魔術串」,但不會那麼「神奇」,因爲linq表達式是在幕後編譯的。

0

編輯**對不起,誤解了這個問題,反思會更好。

編輯***

實際上,沒有,你可以在組合框綁定到一組具有謂詞屬性的對象,然後平變化/按鈕事件(無論您使用轉到下一條記錄),你可以得到將對象移出組合框,並在linq方法中使用它的謂詞。

這意味着要爲每個要跳過的屬性維護一組對象,但是如果您想要向comobox添加另一個屬性,則必須執行一些工作。

Dictionary<string, Predicate<YourType>> filters = new ... 
filters.Add("YourProp", x => x.yourProp == "blah blah"); 

Combobox box = new ... 
box.ValueMember = "Value"; 
box.DispayMember = "Key"; 
box.DataSource = filters; 

var pred = box.SelectedValue as Predicate<YourType>; 
if (pred != null) 
{ 
    GoToNextRecord(pred); 
} 

然後在LINQ方法...

dogs...Skip(pred)...; 
1

你可以把一個接口上,它公開searchParameter()成員的基礎類。

var searchValue = dogId; 
return 
    dogList.SkipWhile(x => x.searchParameter() != searchValue).Skip(1).FirstOrDefault().Id.ToString(CultureInfo.InvariantCulture);