C# 在一对多关系上使用动态linq扩展和jqgrid

C# 在一对多关系上使用动态linq扩展和jqgrid,c#,linq,jqgrid,free-jqgrid,C#,Linq,Jqgrid,Free Jqgrid,我不确定问题的标题是否正确,如果不让我知道,我会更改它。好的,首先我在asp.net应用程序中使用jgrid。我有一个助手,可以设置页面大小、行数并进行排序。问题是,我只能对当前表的参数进行排序。当参数名称来自通过关系连接的单独表时,它不起作用 linq扩展用于orderBy和thenBy,它们都接受字符串参数和排序顺序参数。我曾尝试将字符串参数设置为“WaterSample.Name”,WaterSample是关系中的另一个表,并在该表中命名一个参数,但不幸的是,我在c#中无法这样做,因为我使

我不确定问题的标题是否正确,如果不让我知道,我会更改它。好的,首先我在asp.net应用程序中使用jgrid。我有一个助手,可以设置页面大小、行数并进行排序。问题是,我只能对当前表的参数进行排序。当参数名称来自通过关系连接的单独表时,它不起作用

linq扩展用于orderBy和thenBy,它们都接受字符串参数和排序顺序参数。我曾尝试将字符串参数设置为“WaterSample.Name”,WaterSample是关系中的另一个表,并在该表中命名一个参数,但不幸的是,我在c#中无法这样做,因为我使用的是匿名类型。因此,我的问题是,我是否可以让线扩展在关系中搜索,以找到与属性名称匹配的内容。对不起,如果这是一个有点困惑我还是相当新的林克

我已经包括了下面包含扩展的类

namespace Helpers
{
    [ModelBinder(typeof(GridModelBinder))]
    [Serializable]
    public class JqGridSettings
    {

        public int PageIndex { get; set; }
        public int PageSize { get; set; }
        public string SortColumn { get; set; }
        public string SortOrder { get; set; }
        public string SortColumn2 { get; set; }
        public string SortOrder2 { get; set; }
        public string SortColumn3 { get; set; }
        public string SortOrder3 { get; set; }

        public JqGridSettings()
        {
        }

        /// <summary>
        /// Initializes a new instance of the GridSettings class.
        /// </summary>
        /// <param name="stringData">The string that represents the a GridSettings object.</param>
        public JqGridSettings(string stringData)
        {
            var tempArray = stringData.Split(new[] { "#;" }, StringSplitOptions.None);
            PageSize = int.Parse(tempArray[0]);
            PageIndex = int.Parse(tempArray[1]);
            SortColumn = tempArray[2];
            SortOrder = tempArray[3];
        }

        /// <summary>
        /// Build a string used to cache the current GridSettings object.
        /// </summary>
        /// <returns>A string that represents the current GridSettings object.</returns>
        public override string ToString()
        {
            return string.Format("{0}#;{1}#;{2}#;{3}", PageSize, PageIndex, SortColumn,SortOrder);
        }

        public IQueryable<T> LoadGridData<T>(IQueryable<T> dataSource, out int count)
        {
            var query = dataSource;
            //
            // Sorting and Paging by using the current grid settings.
            //
            query = query.OrderBy<T>(SortColumn, SortOrder);
            if (String.IsNullOrEmpty(SortColumn2) == false)
            {
                query = query.ThenBy<T>(SortColumn2, SortOrder2);
            }
            if (String.IsNullOrEmpty(SortColumn3) == false)
            {
                query = query.ThenBy<T>(SortColumn3, SortOrder3);
            }
            count = query.Count();
            //
            if (PageIndex < 1)
                PageIndex = 1;
            //
            var data = query.Skip((PageIndex - 1) * PageSize).Take(PageSize);
            return data;
        }
    }

    public static class LinqExtensions
    {
        public static IQueryable<T> OrderBy<T>(this IQueryable<T> query, string sortColumn, string direction)
        {
            var methodName = string.Format("OrderBy{0}", direction.ToLower() == "asc" ? "" : "descending");
            var parameter = Expression.Parameter(query.ElementType, "p");
            var memberAccess = sortColumn.Split('.').Aggregate<string, MemberExpression>(null, (current, property) => Expression.Property(current ?? (parameter as Expression), property));

            var orderByLambda = Expression.Lambda(memberAccess, parameter);
            var result = Expression.Call(typeof(Queryable),methodName,new[]{query.ElementType, memberAccess.Type},query.Expression,Expression.Quote(orderByLambda));

            return query.Provider.CreateQuery<T>(result);
        }

        public static IQueryable<T> ThenBy<T>(this IQueryable<T> query, string sortColumn, string direction)
        {
            var methodName = string.Format("ThenBy{0}", direction.ToLower() == "asc" ? "" : "descending");
            var parameter = Expression.Parameter(query.ElementType, "p");
            var memberAccess = sortColumn.Split('.').Aggregate<string, MemberExpression>(null, (current, property) => Expression.Property(current ?? (parameter as Expression), property));

            var orderByLambda = Expression.Lambda(memberAccess, parameter);
            var result = Expression.Call(typeof(Queryable), methodName, new[] { query.ElementType, memberAccess.Type }, query.Expression, Expression.Quote(orderByLambda));

            return query.Provider.CreateQuery<T>(result);
        }
    }

    public class GridModelBinder : IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            try
            {
                var request = controllerContext.HttpContext.Request;
                return new JqGridSettings
                {
                    PageIndex = int.Parse(request["page"] ?? "1"),
                    PageSize = int.Parse(request["rows"] ?? "50"),
                    SortColumn = request["sidx"] ?? "",
                    SortOrder = request["sord"] ?? "asc",
                };
            }
            catch
            {
                //
                // For unexpected errors use the default settings!
                //
                return null;
            }
        }
    }

}
名称空间帮助程序
{
[ModelBinder(typeof(GridModelBinder))]
[可序列化]
公共类JqGridSettings
{
公共int页索引{get;set;}
公共int PageSize{get;set;}
公共字符串SortColumn{get;set;}
公共字符串排序器{get;set;}
公共字符串SortColumn2{get;set;}
公共字符串排序器2{get;set;}
公共字符串SortColumn3{get;set;}
公共字符串排序器3{get;set;}
公共JqGridSettings()
{
}
/// 
///初始化GridSettings类的新实例。
/// 
///表示GridSettings对象的名称的字符串。
公共JqGridSettings(字符串stringData)
{
var tempArray=stringData.Split(新的[]{“#”},StringSplitOptions.None);
PageSize=int.Parse(tempArray[0]);
PageIndex=int.Parse(tempArray[1]);
SortColumn=tempArray[2];
SortOrder=tempArray[3];
}
/// 
///生成用于缓存当前GridSettings对象的字符串。
/// 
///表示当前GridSettings对象的字符串。
公共重写字符串ToString()
{
返回string.Format(“{0}}{1}}{2}{3}”,PageSize,PageIndex,SortColumn,SortOrder);
}
公共IQueryable LoadGridData(IQueryable数据源,out int计数)
{
var查询=数据源;
//
//使用当前网格设置进行排序和分页。
//
query=query.OrderBy(SortColumn,SortOrder);
if(String.IsNullOrEmpty(SortColumn2)=false)
{
query=query.ThenBy(SortColumn2,SortOrder2);
}
if(String.IsNullOrEmpty(SortColumn3)=false)
{
query=query.ThenBy(SortColumn3,SortOrder3);
}
count=query.count();
//
如果(页面索引<1)
PageIndex=1;
//
var data=query.Skip((PageIndex-1)*PageSize.Take(PageSize);
返回数据;
}
}
公共静态类LinqExtensions
{
公共静态IQueryable OrderBy(此IQueryable查询,字符串sortColumn,字符串方向)
{
var methodName=string.Format(“OrderBy{0}”,direction.ToLower()=“asc”?:“descending”);
var参数=Expression.parameter(query.ElementType,“p”);
var memberAccess=sortColumn.Split('.').Aggregate(null,(当前,属性)=>Expression.property(当前???(参数作为表达式),属性));
var orderByLambda=Expression.Lambda(memberAccess,参数);
var result=Expression.Call(typeof(Queryable),methodName,new[]{query.ElementType,memberAccess.Type},query.Expression,Expression.Quote(orderByLambda));
返回query.Provider.CreateQuery(结果);
}
公共静态IQueryable ThenBy(此IQueryable查询,字符串排序列,字符串方向)
{
var methodName=string.Format(“ThenBy{0}”,direction.ToLower()=“asc”?:“descending”);
var参数=Expression.parameter(query.ElementType,“p”);
var memberAccess=sortColumn.Split('.').Aggregate(null,(当前,属性)=>Expression.property(当前???(参数作为表达式),属性));
var orderByLambda=Expression.Lambda(memberAccess,参数);
var result=Expression.Call(typeof(Queryable),methodName,new[]{query.ElementType,memberAccess.Type},query.Expression,Expression.Quote(orderByLambda));
返回query.Provider.CreateQuery(结果);
}
}
公共类GridModelBinder:IModelBinder
{
公共对象绑定模型(ControllerContext ControllerContext,ModelBindingContext bindingContext)
{
尝试
{
var request=controllerContext.HttpContext.request;
返回新的JqGridSettings
{
PageIndex=int.Parse(请求[“页面”]??“1”),
PageSize=int.Parse(请求[“行”]??“50”),
SortColumn=请求[“sidx”]??“,
SortOrder=请求[“sord”]??“asc”,
};
}
抓住
{
//
//对于意外错误,请使用默认设置!
//
返回null;
}
}
}
}

感谢您的帮助或建议。

数据集中总共有多少行需要显示(数据集将不断增长,因此它将变得相当大。不幸的是,我们没有使用实体框架。那么您使用什么来代替实体框架?据我所知,我们只使用linq。过滤效果很好,如果pr