我有兩種材料請求和安全用戶模型:
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; }
}
我想根據 User Name 對 Material Requests 進行搜索,所以我制作了一個 Material Request 的視圖模型,如下所示:
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; }
}
我從視圖中獲取用戶名并創建一個像 "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() 方法無法執行查詢。這是一個正確的方法嗎?
uj5u.com熱心網友回復:
如果您將“SearchQuery”作為字串格式傳遞給 GetPagedRecords() 方法,您可以在“MaterialRequestMaster”模型中的屬性用戶 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; }
}
然后使用反射來獲取 property 屬性的值并將其添加到您的 where 子句中。值應該是這樣的:
RelationPropertyValue = assembly.GetProperty("UserId").GetCustomAttribute<RelationName>();
searchQuery = $"x => x.{RelationPropertyValue}.Contains(\"Something\")"
我認為它對你有用。
uj5u.com熱心網友回復:
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;
等等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/400011.html
標籤:C# 林克 asp.net核心 模型视图控制器 视图模型
下一篇:將熱源1與冷源2合并
