C# 动态LINQ筛选器从不检索正确的结果(UWP/XAML)
我有一个C# 动态LINQ筛选器从不检索正确的结果(UWP/XAML),c#,linq,xaml,uwp,C#,Linq,Xaml,Uwp,我有一个ObservableCollectionMiniList,我的班级是: public class Miniature { public string Name { get; set; } public int Quantity { get; set; } public string Image { get; set; } public string Manufacturer { get; set; } public string Set { get
ObservableCollectionMiniList
,我的班级是:
public class Miniature
{
public string Name { get; set; }
public int Quantity { get; set; }
public string Image { get; set; }
public string Manufacturer { get; set; }
public string Set { get; set; }
public string Location { get; set; }
}
这些属性的名称被输入到一个组合框中,用户可以在该组合框中选择一个(或全部选择),然后键入搜索词以对列表进行排序。
以下是xaml的价值:
<TextBlock Text="Search"
Style="{StaticResource RPTextBlock}"/>
<ComboBox Name="FilterComboBox"
ItemsSource="{x:Bind FilterComboList}"
Style="{StaticResource RPCombo}"
FlowDirection="RightToLeft"
SelectionChanged="FilterComboBox_SelectionChanged"
Loaded="comboBox_Loaded"/>
<TextBlock Text="For"
Style="{StaticResource RPTextBlock}"/>
<TextBox Name="SearchTextBox"
PlaceholderText="Search Term"/>
<Button Content=""
Name="SearchIcon"
Style="{StaticResource RPButton}"
FontFamily="Segoe MDL2 Assets"
FontSize="20"
Click="SearchIcon_Click"/>
调用此方法的:
private void FilterGridView(string submission)
{
var selected = FilterComboBox.SelectedValue;
MVM = new MiniViewModel();//This is specific for passing a pregenerated list of minis, later might load from disk or db
var templist = MVM.MiniCollection.AsQueryable()
.Where("@0 = @1", selected, submission);
MiniList.Clear();
templist.ToList<Miniature>()
.ForEach(m => MiniList.Add(m));
}
private void FilterGridView(字符串提交)
{
所选变量=FilterComboBox.SelectedValue;
MVM=new MiniViewModel();//这是特定于传递预生成的mini列表的,以后可能从磁盘或数据库加载
var templast=MVM.MiniCollection.AsQueryable()
。其中(“@0=@1”,选中,提交);
MiniList.Clear();
圣殿骑士
.ForEach(m=>MiniList.Add(m));
}
即使使用最基本的示例,尝试字符串或int属性也不会产生任何结果。selected和submission显示正确,例如,如果我在组合框中选择Name并键入“Succubus”,则tempList的值显示为
templist {System.Collections.Generic.List`1[UWPMiniatures.Models.Miniature].Where(Param_0 => ("Name" == "Succubus"))} System.Linq.IQueryable<UWPMiniatures.Models.Miniature> {System.Linq.EnumerableQuery<UWPMiniatures.Models.Miniature>}
templast{System.Collections.Generic.List`1[UWPMiniatures.Models.minimal].Where(Param_0=>(“Name”==“Succubus”)}System.Linq.IQueryable{System.Linq.EnumerableQuery}
但它确实清除了显示我的项目的网格。在“结果”视图下调试和单步遍历模板列表时,总是说“{Empty”枚举未产生任何结果”
我曾在一个简单的控制台程序上尝试过这种设置,但无法使其正常工作,尽管这与我所看到的示例非常相似,所以我不确定我做错了什么,或者是否有其他方法可以做到这一点
编辑-我不知道如何解释它。让我试着填补一些空白。我在xaml中有一个gridview,它的源代码是
ObservableCollectionMiniList
。现在源代码是用测试值初始化的。我希望能够通过输入搜索项并从组合框中为类选择一个属性值来过滤列表,例如,如果我在搜索框中选择属性Quantity并键入2,它会在gridview中显示Quantity==2的所有项目。正如我所说,尝试linq的动态扩展不起作用。动态linq中的@0
,@1
等都是常量占位符。因此
.Where("@0 = @1", selected, submission);
生成无意义字符串比较
"Name" == "Succubus"
因此,没有得到正确的结果也就不足为奇了
您真正需要的是在谓词字符串中嵌入属性名,并且只对值使用占位符
假设所选的变量包含属性名称,用法如下:
.Where(selected + " = @0", submission);
或使用C#6:
这似乎令人困惑,你能分享一下你到底想要实现什么吗?即使是一个工作流也可以
.Where(selected + " = @0", submission);
.Where($"{selected} = @0", submission);