相关疑难解决方法(0)

EF中的多个条件

可能重复:
条件Linq查询

使用Entity Framework 4.0

我有这样的搜索条件

在此输入图像描述

有四个字段允许用户过滤搜索.条件都是AND.如果文本框值为String.Empty或者下拉列表值为全部,则结果必须省略相应的过滤器.可以在存储过程中执行此操作,但我无法在Linq2SQL/Entity Framework方案中模仿这一点.

我的问题是这个,如何在Linq中根据一些输入值省略IEnumerable.Where?

c# linq asp.net entity-framework

22
推荐指数
3
解决办法
5万
查看次数

如何动态创建谓词

您好我想使用谓词表达式基于搜索字符串创建列表.

我有一个类型产品列表包含不同的名称.

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)

.net c# linq list predicatebuilder

10
推荐指数
1
解决办法
1万
查看次数

我应该如何从服务层方法中公开总记录数和IEnumable分页记录集合?

我首先使用EF4代码,并拥有持久性存储库和与之交互的服务层.我有一个服务层方法,它在我的存储库上调用IQueryable方法并返回包含实体的IEnumerable.我还需要返回总记录数,以便我可以计算分页链接.

我应该如何从我的服务方法返回int和IEnumerable?

  • 在方法上使用out参数来计算总行数
  • 创建一个单独的类,其中包括总行数作为属性
  • 将分页LINQ查询移出服务层(从服务层上的repo中公开IQueryable)
  • 在服务层上创建一个完全独立的方法,只为count执行新查询.

所有这些都应该有效,但哪一个最干净?

更新: 这是对架构的一些澄清.如果这是错误的,请告诉我更好的方法(例如 - 在表示层而不是服务层进行分页等)

回购层:

返回DbSet的IQueryable,从表示层抽象出db访问

服务层:

对IQueryable执行LINQ查询以进行过滤,并根据需要使用skip和take获取页面项并返回IEnumerable(返回时也设置为List以避免任何DbContext生命周期问题)

表示层:

在Service层上调用该方法(getPagedResults(filters,pageNumber,pageSize))

从它的外观来看,我还需要添加一个单独的方法来获得总结果.希望能在一个电话中完成这一切.

我宁愿不将所有记录带回演示文稿,然后页面......似乎效率低下.

c# asp.net pagination entity-framework repository

8
推荐指数
1
解决办法
5990
查看次数

PredicateBuilder无法转换为IQueryable?

我有一个功能:

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)

这段代码运行得很好.

我需要将其转换为使用PredicateBuilder:

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)

您可以选择错误:

  • 实例参数:无法从'System.Collections.Generic.IEnumerable'转换为'System.Linq.IQueryable'
  • 'System.Collections.Generic.IEnumerable'不包含'Where'的定义和最佳扩展方法重载'System.Linq.Enumerable.Where(System.Collections.Generic.IEnumerable,System.Func)'有一些无效的参数
  • 参数2:无法从'System.Linq.Expressions.Expression>'转换为'System.Func'

有什么问题?IEnumerable进去,IEnumerable出来.

我会说实话,我读了这个页面PredicateBuilder,我不明白其中任何一个.


一个淡淡,为什么我需要改变PredicateBuilder …

linq predicate iqueryable predicatebuilder

5
推荐指数
1
解决办法
2673
查看次数