【问题标题】:Is it Possible to execute two LINQ queries of different types at the same time?是否可以同时执行两个不同类型的 LINQ 查询?
【发布时间】:2022-01-01 09:28:21
【问题描述】:

我有两种材料请求和安全用户模型:

public class MaterialRequestMaster : BaseDomain<long>
{
  public string RequestCode { get; private set; }
  public string Description { get; private set; }
  public GlobalEnums.MaterialRequestStatus Status { get; set; }
  public int UserId { get; private set; }

  public SecurityUser User { get; private set; } 
}  
public class SecurityUser :IdentityUser<int>
{
  public string  Name { get; set; }
  public int  PersonelCodeId { get; set; }
  public ICollection<MaterialRequestMaster> MaterialRequestMaster { get; set; }
}

我想根据用户名搜索材料请求,所以我制作了一个这样的材料请求视图模型:

public class MaterialRequestMasterViewModel
{
  public long Id { get; set; }
  [Required(ErrorMessage = "Please Enter The Code")]
  public string RequestCode { get; set; }
  public GlobalEnums.MaterialRequestStatus Status{ get; set; }
  [MaxLength(255)]
  public string Description { get; set; }
  public int UserId { get; set; }
  public string UserName { get; set; }
  public bool IsDeleted { get; set; }
  public DateTime CreationDate { get; set; }
}    

我从视图中获取用户名并创建一个 where 字符串,如“x=>x.UserName.Contains("Something")”,并将其作为 searchQuery 发送到我的材料请求搜索方法:

public IPagedList<MaterialRequestMasterViewModel> GetPagedRecords(int pageNumber, int pageSize, string orderByCol, string order, string searchQuery)
{
IQueryable<MaterialRequestMaster> query;

query = query = _IMRMRepository.Get(); //Gets all records of <MaterialRecustMaster>

IQueryable<MaterialRequestMasterViewModel> searchedQuery;

searchedQuery = query.Select(n => new MaterialRequestMasterViewModel //Fill ViewModel 
 (
  n.Id,
  n.RequestCode,
  n.Status,
  n.Description,
  n.UserId,
  n.User.Name,
  n.CreationDate,
  n.IsDeleted
 ));

if (!string.IsNullOrWhiteSpace(searchQuery))
 searchedQuery = searchedQuery.Where(searchQuery);

return searchedQuery.ToPagedList(pageNumber, pageSize);
}

由于 LINQ 转换问题,ToPagedList() 方法无法执行查询。 这是一个正确的方法吗?

【问题讨论】:

  • 当然应该在搜索中尽早使用Where;如果搜索没有返回,返回什么?

标签: c# linq asp.net-core model-view-controller viewmodel


【解决方案1】:

如果您将“SearchQuery”以字符串格式传递给 GetPagedRecords() 方法,您可以在“MaterialRequestMasterViewModel”视图模型的属性用户 id 的标题中添加一个属性,并使用安全用户模型的名称。

public class MaterialRequestMasterViewModel
{
  public long Id { get; set; }
  [Required(ErrorMessage = "Please Enter The Code")]
  public string RequestCode { get; set; }
  public GlobalEnums.MaterialRequestStatus Status{ get; set; }
  [MaxLength(255)]
  public string Description { get; set; }
  [RelationName="SecurityUser"]
  public int UserId { get; set; }
  public string UserName { get; set; }
  public bool IsDeleted { get; set; }
  public DateTime CreationDate { get; set; }
}    

然后使用反射来获取属性属性的值并将其添加到您的 where 子句中。 搜索查询值应该是这样的:

RelationPropertyValue = assembly.GetProperty("UserId").GetCustomAttribute<RelationName>();
searchQuery = $"x => x.{RelationPropertyValue}.Contains(\"Something\")"

我认为它对你有用。

【讨论】:

    【解决方案2】:

    where 的参数必须是布尔函数,所以你应该这样发送它而不是字符串。

    public IPagedList<MaterialRequestMasterViewModel> GetPagedRecords(int pageNumber, int pageSize, string orderByCol, string order, Func<SecurityUser ,Boolean> searchQuery )
    {
    IQueryable<MaterialRequestMaster> query;
    
    query = query = _IMRMRepository.Get(); //Gets all records of <MaterialRecustMaster>
    
    IQueryable<MaterialRequestMasterViewModel> searchedQuery;
    
    searchedQuery = query.Select(n => new MaterialRequestMasterViewModel //Fill ViewModel 
     (
      n.Id,
      n.RequestCode,
      n.Status,
      n.Description,
      n.UserId,
      n.User.Name,
      n.CreationDate,
      n.IsDeleted
     ));
    
    if (searchQuery != null)
     searchedQuery = searchedQuery.Where(searchQuery);
    
    return searchedQuery.ToPagedList(pageNumber, pageSize);
    }
    

    你可以像这样创建函数变量

    Func<SecurityUser, boolean> searchFunc = x => x.UserName.Contains("Something");
    

    你可以像这样组合这种类型的多个函数

    Func<SecurityUser, boolean> combined = x=> searchFunc(x) || x.Id > 100;
    

    等等

    【讨论】:

    • 感谢答案,但是字符串是动态的,我根据来自搜索表单的搜索参数在另一种方法中生成它。
    • 我编辑了我的答案以更好地满足您的需要
    猜你喜欢
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多