动态生成 LINQ

Dynamically generate LINQ

我有一个 GetX(DataTableParameters model) 函数,其中 model.Order 包含 Column(可以是 1 (Id)、2 (Name) 等)和 Dir(可以是 'asc'或 'desc')。然后我有一个 LINQ 查询,我想根据模型值动态生成 OrderByDescending 或 OrderBy 和 r => r.Id 或 r => r.Name。

DbContext.Users.Where(r => r.FirstName.Contains(model.Search.Value) ||
                            r.LastName.Contains(model.Search.Value) ||
                           r.Email.Contains(model.Search.Value))
.**OrderByDescending(r => r.Id)**.Skip(model.Start).Take(model.Length);

这能做到吗?如果是这样,任何人都可以指出我正确的方向。感谢您的帮助。

使用 Dynamic Linq,有一些库可以帮助您使用它。我正在使用它,它看起来很棒,查看此处了解更多信息

它是一个突然被删除的旧库的分支,它允许你编写像

这样的动态代码
var result = myQuery
    .OrderBy("Field1 asc")
    .Select("new (Field1, Field2)");

查看 http://web.archive.org/web/20160109203827/http://dynamiclinq.azurewebsites.net/(旧库的文档)以获得良好的概览。

您似乎在使用数据表。我有相同的场景并编写了一些代码,利用 PagedList nuget package 为数据表提供分页的、可排序的 JSON 数据。

用法如下:

[HttpPost]
public JsonResult GetJson(DataTablesParam param)
{
    using (var context = new SalesContext())
    {
        return context.Sales
            .TrustedSortToPagedList(param.ToPagingCriteria())
            .Select(s => new SaleViewModel(s))
            .ToDataTableResult(param.Draw);
    }
}

在 javascript 中,我在 DataTable 配置中包含了这个参数:

ajax: {
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    url: "@Url.Action("GetJson")",
    type: "POST",
    data: function(d) {
        // add extra query parameters here
        d.startDate = $("#startDate").val();
        d.endDate = $("#endDate").val();
        return JSON.stringify(d);
    },
},

完整代码可在 gist 中找到。

var query=DbContext
  .Users
  .Where(r => r.FirstName.Contains(model.Search.Value) ||
              r.LastName.Contains(model.Search.Value) ||
              r.Email.Contains(model.Search.Value));

switch(Model.Order)
{
  case 1:
    query=(Model.Dir=="asc")?
      query.OrderBy(q=>q.id):
      query.OrderByDescending(q=>q.id);
    break;
  case 2:
    query=(Model.Dir=="asc")?
      query.OrderBy(q=>q.Name):
      query.OrderByDescending(q=>q.Name);
    break;
}
query=query
  .Skip(Model.Start)
  .Take(Model.Length);