sql的linq lambda表达式包含

哈帕戈尼斯

我正在使用通用存储库,如下所示:

 itemsList = (from myrow in UoW.FileRepository.Get()
 select new FileModel()
 {record_id = myrow.type_id,
  descr = myrow.descr}).ToList();});

这是Get方法:

 public virtual IEnumerable<TEntity> Get()
    {
        //  _aQuery = _theDbContext.Set<TEntity>();
        IEnumerable<TEntity> query = _aQuery;
        return query;
    }

如果要创建类似的查询以在特定字段中搜索特定字符串,我将如何实现通用linq lambda表达式?在我的视图模型中,我想调用类似以下内容的东西:

     from myrow in UoW.FileRepository.Srch(nameofFieldToSearch, searchString). 

查询看起来像这样吗?

   public IEnumerable<TEntity> Srch(Expression<Func<TEntity, bool>> expression)
    {
        IEnumerable<TEntity> srchList = _aQuery.ToList();
        return srchList.Where(????);

    }

谢谢您的建议。

编辑-----------------------我在通用存储库类中拥有所有查询,例如Get和Srch,现在只需要知道如何声明查询即可在存储库类中,以及如何使用我的viewmodel中的搜索字符串调用它。我不确定在哪里/何时实现和编译是否达成共识?我看到了另一个讨论http://www.fascinatedwithsoftware.com/blog/post/2012/01/10/More-on-Expression-vs-Func-with-Entity-Framework.aspx,下面我引用它来询问是否在这里建议使用相同的方法吗?再次感谢你。

“探查器告诉我们,LoadMyEntities被调用了很多次,这占用了我们大量的CPU时间。下面的简单更改解决了这个问题。您能猜出为什么吗?”

public IEnumerable<MyEntity> LoadMyEntities(Func<MyEntity, bool> predicate)
{return Context.MyEntities.Where(predicate);}

“参数现在是Func <>而不是Expression>。之所以如此与众不同,是因为以Expression形式的谓词被传递给SQL Server,而作为Func传递的谓词却没有传递。通常,您希望SQL Server为您做更多的事情,而Expression是一个正确的选择,但是在这种情况下,我们想在上下文中预加载整个表-这正是Func会的。

  1. Where扩展方法具有两种风格。一个扩展了IQueryable并采用了一个Expression参数。另一个扩展了IEnumerable并采用了Func。
  2. 由于“谓词”现在是一个Func,因此使用扩展IEnumerable的位置。
  3. 实体框架用于构建SQL查询的流畅接口基于IQueryables,而不是IEnumerables。因此,流利性就在Where之前停止。传递给实体框架的语句部分只是Context.MyEntities。
  4. 因此,Context.MyEntities将整个表返回到上下文。
  5. 现在,整个表都使用谓词进行了过滤,并返回了我们真正想要的值。
  6. 下次调用该方法时,实体框架将意识到我们想要的记录已经在上下文中。(在我的情况下,我们通过主键进行查询,并且EF显然很聪明,可以知道如果上下文中存在具有该ID的记录,它将在数据库中找不到其他这样的记录。)不使用SQL Server,我们可以节省大量时间。显然,有些情况下您不希望这样做,但就我们而言,这正是我们想要的。该表相对较小,并且同一上下文被查询了数百次。

在原始版本中,谓词是一个Expression,因此编译器使用了扩展IQueryable的Where。因此,该谓词被传递给SQL Server,SQL Server忠实地将仅一行返回给上下文。下次我们调用LoadMyEntities时,实体框架必须再次调用SQL Server。”

柬埔寨Mrinal

这将是使用表达式树的简单实现。以下是完整的解决方案:

获取方法的表达式的Srch方法:

Public Expression<Func<TEntity, bool>> SrchExpression(string nameofFieldToSearch, string searchString)
{
  var parameterType = Expression.Parameter(typeof(TEntity), "obj");

  var memberExpression = Expression.Property(typeof(string), nameofFieldToSearch)

 // Calls Extension method created underneath
 var filtersMethodInfo = typeof(StringExtensions).GetMethod("Contains", new[] { typeof(string), typeof(string) });

 var filtersConstantExpression = Expression.Constant(searchString, typeof(string));

 var finalExpression = Expression.Call(null, filtersMethodInfo, memberExpression, filtersConstantExpression)

 return Expression.Lambda<Func<TEntity, bool>>(finalExpression, parameterType)
}

//为Contains创建一个String扩展方法

public static class StringExtensions
{        
    public static bool Contains(this string source, string searchString)
    {
        return source?.IndexOf(subString, StringComparison.OrdinalIgnoreCase) >= 0;
    }
}

现在,您的Srch方法应如下所示:

public IEnumerable<TEntity> Srch(Expression<Func<TEntity, bool>> expression)
{
    Func<TEntity, bool>> func = expression.Compile();
    IEnumerable<TEntity> srchList = _aQuery.Where(o => func(o));
    return srchList;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

sql的linq lambda表达式包含

来自分类Dev

表达式不能包含lambda表达式Linq

来自分类Dev

在linq-2-sql表达式中包含lambda

来自分类Dev

LINQ表达式包含

来自分类Dev

包含 LEFT JOIN 的实体框架 Linq to SQL 表达式

来自分类Dev

SQL查询到LINQ Lambda表达式

来自分类Dev

Linq Lambda表达式中存在SQL

来自分类Dev

lambda和linq表达式

来自分类Dev

linq表达式中的内联lambda?

来自分类Dev

LINQ Lambda表达式中的语句

来自分类Dev

具有包含的lambda中的C#linq表达式

来自分类Dev

LINQ lambda表达式引发序列不包含任何元素

来自分类Dev

将Linq查询表达式转换为Linq Lambda表达式

来自分类Dev

linq表达式不能包含lamba表达式异常

来自分类Dev

Linq表达式IEnumerable <TEntity>不包含对where的定义

来自分类Dev

如何在LINQ表达式中包含多个层次?

来自分类Dev

C#LINQ to SQL在lambda表达式内指定类型的成员

来自分类Dev

使用Lambda表达式以及Join,GroupBy,Count和Sum的Linq to SQL

来自分类Dev

如何使用Lambda表达式将SQL查询写入LINQ?

来自分类Dev

将SQL语句合并到LINQ Lambda表达式中

来自分类Dev

可以使用dart将linq lambda表达式转换为SQL吗?

来自分类Dev

如何将此SQL请求转换为Lambda表达式或LINQ

来自分类Dev

如何从SQL Server 2014使用LINQ lambda表达式返回多行?

来自分类Dev

使用 sum 和 group by 条件将 SQL 查询转换为 linq/lambda 表达式

来自分类Dev

结合两个Linq lambda表达式

来自分类Dev

Linq Lambda表达式多对多表选择

来自分类Dev

如何编写递归lambda表达式(LINQ查询)

来自分类Dev

使用Lambda表达式更新linq中的多列

来自分类Dev

在Linq中使用Lambda表达式的正确方法

Related 相关文章

热门标签

归档