可能重复:
条件Linq查询
使用Entity Framework 4.0
我有这样的搜索条件

有四个字段允许用户过滤搜索.条件都是AND.如果文本框值为String.Empty或者下拉列表值为全部,则结果必须省略相应的过滤器.可以在存储过程中执行此操作,但我无法在Linq2SQL/Entity Framework方案中模仿这一点.
我的问题是这个,如何在Linq中根据一些输入值省略IEnumerable.Where?
您好我想使用谓词表达式基于搜索字符串创建列表.
我有一个类型产品列表包含不同的名称.
List<products> list1 = new List<products>();
list1.Add(new products("sowmya"));
list1.Add(new products("Jane"));
list1.Add(new products("John"));
list1.Add(new products("kumar"));
list1.Add(new products("ramya"));
listBox1.ItemsSource = list1;
Run Code Online (Sandbox Code Playgroud)
现在我想根据用户输入过滤内容.用户将输入n个字符串,并带有'+'作为分隔符.收到字符串后,我会将它们传递给谓词对象
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
List<products> list2 = new List<products>();
Expression<Func<products, bool>> predicate = PredicateBuilder.True<products>();
if (e.Key == Key.Enter)
{
string Searchstring = textBox1.Text.ToString().Trim();
string[] separator = new string[] { "+" };
string[] SearchItems=Searchstring.Split(separator,StringSplitOptions.None);
foreach (string str in SearchItems)
{
string temp = str;
predicate =p => p.Name.Contains(temp.ToLower());
}
list2 = list1.AsQueryable().Where(predicate).ToList();
listBox1.ItemsSource = list2;
}
} …Run Code Online (Sandbox Code Playgroud) 我首先使用EF4代码,并拥有持久性存储库和与之交互的服务层.我有一个服务层方法,它在我的存储库上调用IQueryable方法并返回包含实体的IEnumerable.我还需要返回总记录数,以便我可以计算分页链接.
我应该如何从我的服务方法返回int和IEnumerable?
所有这些都应该有效,但哪一个最干净?
更新: 这是对架构的一些澄清.如果这是错误的,请告诉我更好的方法(例如 - 在表示层而不是服务层进行分页等)
回购层:
返回DbSet的IQueryable,从表示层抽象出db访问
服务层:
对IQueryable执行LINQ查询以进行过滤,并根据需要使用skip和take获取页面项并返回IEnumerable(返回时也设置为List以避免任何DbContext生命周期问题)
表示层:
在Service层上调用该方法(getPagedResults(filters,pageNumber,pageSize))
从它的外观来看,我还需要添加一个单独的方法来获得总结果.希望能在一个电话中完成这一切.
我宁愿不将所有记录带回演示文稿,然后页面......似乎效率低下.
我有一个功能:
private IEnumerable<Promotion> MatchesKeyword(IEnumerable<Promotion> list, String keyword)
{
...snip...
}
Run Code Online (Sandbox Code Playgroud)
现在执行LINQ查询:
private IEnumerable<Promotion> MatchesKeyword(IEnumerable<Promotion> list, String keyword)
{
return list.Where(item => item.Name.ContainsText(keyword)
|| item.Description.ContainsText(keyword)
...snip...
);
}
Run Code Online (Sandbox Code Playgroud)
这段代码运行得很好.
private IEnumerable<Promotion> MatchesKeyword(IEnumerable<Promotion> list, String keyword)
{
var predicate = PredicateBuilder.False<Promotion>();
predicate = predicate.Or(item => item.Name.ContainsText(keyword)
|| item.Description.ContainsText(keyword)
...snip...
);
return list.Where(predicate);
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,这不会编译.失败的路线是:
return list.Where(predicate);
Run Code Online (Sandbox Code Playgroud)
您可以选择错误:
有什么问题?IEnumerable进去,IEnumerable出来.
我会说实话,我读了这个页面PredicateBuilder,我不明白其中任何一个.
一个淡淡的,为什么我需要改变PredicateBuilder …
c# ×3
linq ×3
asp.net ×2
.net ×1
iqueryable ×1
list ×1
pagination ×1
predicate ×1
repository ×1