-1

如果我有具有属性 Id、Title、ISBN、Tag 的 Book 实体。在 winform 窗口中,用户可以输入搜索文本并从组合框中选择 ByTitle、ByISBN、ByTag 搜索选项。

在按钮单击事件上,这些值被视为

var comboSelection = (comboBox1.SelectedItem ?? "").ToString();
var searchText = txtSearchText.Text;

现在我想使用这些值从我的存储库中获取值。我已经有 repository.GetBooks() ,它返回 IEnumerable 书籍。

我的问题是如何定义带有组合选择的 where 子句的查询。

var result = repository.GetBooks().Where(x=>x. ....)

显然,如果选择了 ByTag,则该查询应该是.Where(x=>x.Tag==comboSelection)

4

2 回答 2

2

我猜你ComboBox有这些项目:ByTitle, ByISBN, ByTag. 您应该执行以下操作:

//Use this Dictionary to get the corresponding delegate for the Where method
//Suppose your GetBooks() returns a collection of Book elements
Dictionary<Func<Book,bool>> predicates = new Dictionary<Func<Book,bool>>();
predicates.Add("ByTitle", b=>b.Title.Contains(searchText));
predicates.Add("ByISBN", b=>b.ISBN.Contains(searchText));
predicates.Add("ByTag", b=>b.Tag.Contains(searchText));

if(comboSelection != ""){
  var result = repository.GetBooks().Where(predicates[comboSelection]);
  //... other code
}

注意:其他方法:

  • 使用Reflection,但是您ComboBox items应该与相应的Property name.
  • 使用Dynamic LINQ,您应该搜索更多关于此的内容。
于 2013-10-17T12:02:08.290 回答
1

您可以使用动态 Linq 库。之后你可以写一些这样的东西

repository.GetBooks().Where("Tag == @0", comboSelection);
于 2013-10-17T08:30:57.207 回答