0

我正在尝试从我的实体框架数据库上下文中将新数据返回到 jTable。我希望能够对这些数据进行排序,但我没有任何运气。我将一个变量传递给我的 linq 查询的 orderby 语句,但不管我做什么 - 它不会排序。如果我输入该字符串的值,它会起作用 - 所以我想知道是否可以将字符串变量添加到 linq 查询中?从我在这里看到的其他内容来看,这似乎是一个常见问题。

我在 VS 2010、.net 4.0、MVC 3 中,我已经添加并尝试让 Dynamic Linq 工作并使用 System.Data.Entity 添加它;

 [HttpPost]
    public JsonResult WineList(string jtSorting = null, int ProducerID = 0)
    {
        try
        {


            jtSorting = "wine." + jtSorting.Replace("ASC", "ascending").Replace("DESC", "descending");


            List<Wine> wines = db.Wines.Where(w => w.Active == true).Where(w => w.ProducerID == ProducerID).ToList(); 

            //have to do this so we don't get circular references between producers and wines


            var q = (from w in wines
                    let wine = new
                    {
                        WineID = w.WineID,
                        Producer = w.Producer.Name,
                        VarType = w.VarType.Name,
                        Vintage = w.Vintage.Name,
                        Name = w.ShortName,
                        App = w.App.Name
                    }
                    orderby(jtSorting)
                    select wine);

            //var x = from w in q
            //        orderby jtSorting
            //        select w;



            return Json(new { Result = "OK", Records = q });

        }
        catch (Exception ex)
        {

            return Json(new { Result = "ERROR", Message = ex.Message });
        }

    }

如果有人有更好的方法来处理 jtable,我也愿意!谢谢

4

3 回答 3

1

您想要动态排序,在哪里传递一个字段和一个订单?

IEnumerable<T> 上的动态 LINQ OrderBy

于 2012-05-10T17:00:10.433 回答
1

1:我认为即使传递一个布尔值也比传递一个字符串来指示 orderby 更好,比如

  bool isDesc

2:

var wines = db.Wines.Where(w => w.Active && w.ProducerID == producerID);
if(isDesc)
{ 
    wines = wines.OrderByDesc(w=>w.XXX);
}
else 
{
    wines = wines.OrderBy(w=>w.XXX);
}

var list = wines.ToList(); 

3:使用AutoMapper将您的对象从一种类型映射到另一种类型会更好,除非您真的想匿名。

于 2012-05-10T17:04:23.280 回答
0

我也在一个项目中使用jTable。Ricci Gian Maria在这里很好地总结了这个“OrderBy”问题。

上述问题的解决方案其实很简单,你应该只开始思考 OrderBy LINQ 操作符是如何工作的,它基本上接受一个表达排序标准的 lambda,对于一个客户对象,它可以是 OrderBy( c=> c.顾客姓名)。将属性表示为字符串的问题是 OrderBy 方法接受一个表达式。

Adam Anderson 的博客建立在 Nick 提供的示例之上。他有一个很好的 OrderByHelper 示例,可以将 jtSorting 字符串转换为表达式。使用 OrderByHelper,您可以扩展 OrderBy 方法以接受 jtSorting 作为输入。将代码从他的页面复制到一个包含 System.Linq.Expressions 和 System.Reflection 的新类中。一旦 OrderyHelper 成为您项目的一部分,您就可以开始将 jtSorting 作为 OrderBy 参数传递。然后,您的代码将简化为...

List<Wine> wines = db.Wines.OrderBy(jtSorting).Where(w => w.Active == true).Where(w => w.ProducerID == ProducerID).ToList();

希望这可以帮助!

于 2013-02-11T22:03:36.567 回答