【问题标题】:How to set dynamic column in linq query如何在 linq 查询中设置动态列
【发布时间】:2021-06-01 18:21:38
【问题描述】:

我有以下代码,

public List<MemberDto> GetMembers(out int rowCount,int pageIndex,int pageSize,  string seachBy = "", string searchTerm = "", string sortBy = "", string sortDiection = "")
{
    var members = (from m in context.Members
                   where (string.IsNullOrEmpty(searchTerm) || m.MemberNumber.Equals(searchTerm))
                         || (string.IsNullOrEmpty(searchTerm) || m.LastName.Equals(searchTerm))
                   select m).AsEnumerable();
                   
    if (!string.IsNullOrEmpty(sortBy))
    {
        PropertyDescriptor prop = TypeDescriptor.GetProperties(typeof(EFModel.ClientData.Member)).Find(sortBy, true);
        members = (sortDiection.ToLower() == "descnding") ? members.OrderByDescending(x => prop.GetValue(x)).ToList() : members.OrderBy(x => prop.GetValue(x)).ToList();
    }

    rowCount =  (!string.IsNullOrEmpty(searchTerm)) ? members.Count() : rowCount = context.Members.Count() ;
    
    members = members.Skip(pageIndex).Take(pageSize).ToList();

    List<MemberDto> memberDtos = new List<MemberDto>();
    mapper.Map(members, memberDtos);
    return memberDtos;
}
  • 在上述方法中,字符串seachColumn 的值可以是membernolastname 或有时为空。当seachColumn 的值为memberno。我只需要在MemberNumber 列中搜索searchTerm 值。

  • seachColumn 的值为lastname。我只需要在LastName 列中搜索searchTerm 值。

  • 有时searchTerm 可以为空。当它发生时,我需要所有记录而不考虑任何搜索词。

以上查询正在运行。问题是当有searchTerm 的值时,无论列如何,都会给出该结果。我该怎么做。

【问题讨论】:

  • 您可以在IQueryable 上附加.Where 子句,它们是隐含的逻辑AND 语句(编辑:用于在实体框架中查询数据库的实现)。所以你会有你的“常规”查询,如果你的 searchTerm 不为空,然后说query = query.Where(x =&gt; ...)
  • @BurnsBA 先生,你能给我一个完整的答案吗
  • @BurnsBA 我更新了我方法的另一部分,以便让其他人有一个清晰的想法
  • @Rooter,这段代码正确吗? searchColumn 定义在哪里?

标签: c# entity-framework linq


【解决方案1】:
public List<MemberDto> GetMembers(out int rowCount,int pageIndex,int pageSize,  string seachColumn = "", string searchTerm = "", string sortBy = "", string sortDiection = "")
{
   var query = context.Members;
  if(string.IsNullOrWhitespace(searchTerm)
  {
        return query.ToList();
  }


//if you want to check strings equality in ignore-case mode, you should change your db collation using the link below.

return query
        .Where(m => m.MemberNumber.Equals(searchTerm) ||  m.LastName.Equals(searchTerm))
        .ToList();
}

String equality check in ef using db collation

【讨论】:

    猜你喜欢
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 2014-01-07
    相关资源
    最近更新 更多