动态生成LINQ

时间:2015-10-21 13:53:31

标签: c# linq ef-database-first

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

/root:
        File: root
        Directory: /

/dev/data1:
        File: data1
        Directory: /dev

/dev/data1/data3:
        File: data3
        Directory: /dev/data1

/usr/local/oravg/oradat:
        File: oradat
        Directory: /usr/local/oravg

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

3 个答案:

答案 0 :(得分:1)

使用动态Linq ,有一些库可以帮助您使用它。我正在使用它,它看起来很棒,请在这里查看更多信息

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

这样的动态代码
scale_x_continuous("Standard Length [mm]",limits=c(30,85),breaks=c(30,35,40,45,50,55,60,65,70,75,80,85))

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

答案 1 :(得分:1)

看起来你正在使用DataTables。我有相同的场景,并编写了一些代码,利用PagedList nuget package为DataTables提供分页,可排序的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中找到。

答案 2 :(得分:1)

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);