首页 / C# / c#-订购linq查询
c#-订购linq查询
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-订购linq查询,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3778字,纯文字阅读大概需要6分钟。
内容图文
![c#-订购linq查询](/upload/InfoBanner/zyjiaocheng/670/81202c66c746425c96680fb261f4abdf.jpg)
对于我的通用网格,我目前正在执行此操作以激活排序:
Elements.OrderBy(column.SortExpression).AsQueryable();
其中SortExpression的类型为Func< T,object>.列是通用类Column< T>.
我在这样的控制器中设置SortExpression:
new Column<OrderViewData>{Key = "ShippingDate", SortExpression = e => e.ShippingDate}
‘OrderBy’导致执行我不想要的sql语句.
所以我试图用它代替它:
Elements = from element in Elements
orderby column.SortExpression
select element;
这不会触发sql执行.
现在,当然是column.SortExpression应该是另一种类型.只有我真的不能弄清楚它应该是什么类型以及如何在控制器的通用类上设置它.
我仍然应该能够以某种通用的强类型化方式设置SortExpression.
关于如何通过应用程序中其他位置的表达式集进行排序的任何建议,将订单应用于IQueryable时都无需执行sql?
// @ Earwicker:
这有效:
Expression<Func<Employee, DateTime?>> sortexpression = e => e.BirthDate;
var db = new NorthwindDataContext();
var query = from e in db.Employees
select e;
query = query.OrderBy(sortexpression);
int count = query.Count();
并生成:
SELECT COUNT(*) AS [value]
FROM [dbo].[Employees] AS [t0]
我何时更换DateTime?在对象的第一行:
Expression<Func<Employee, object>> sortexpression = e => e.BirthDate;
我收到一个InvalidOperationException:无法按类型’System.Object’进行排序
现在,您可能会说:“然后只使用DateTime吗?”,但是我想在通用网格中构建列以要求最少的代码量.我不希望人们键入整个Expression< Func< Employee,some_type>>.我希望人们能够像我第一次尝试时那样键入小的内容SortExpression = e => e.BirthDate,在这里我利用通用的Column类定义“ T”.
您是否认为有可能创建某种扩展以某种方式获取e.BirthDate的类型,然后将其转换为Func< T,object>.表达式< Func< T,some_type>> ?
然后,我可以在内部代码中执行以下操作:
Elements.OrderBy(column.SortExpression.FixCast())
我现在不太在乎我的内部代码是否丑陋或复杂.我需要正确执行SQL查询&注意使用网格的开发人员的可用性.
非常感谢您的帮助!
@ Earwicker 2:
var gridBuilder = new RainbowGridBuilder<Employee>("Examples_Employees")
{
Elements = GetEmployees(), //The elements (records) we will show in our grid.
//Define the columns for our grid.
Columns = new List<Column<Employee>>{
new Column<Employee> {
Key = "EmployeeId", //Key is used for sorting, selecting columns, ...
Header = "Employee Id", //The header of the column. Also used as caption in the column selection checkboxlist.
ValueExpression = e => e.EmployeeID.ToString(), //The Linq expression which will be executed on each element to fill the cell
SortExpression = e => e.EmployeeID, //The Linq expression by which to sort the elements in the grid.
Display = false}, //Is this column visible by default?
new Column<Employee> {Key = "Name", ValueExpression = e => e.FirstName + " " + e.LastName, SortExpression = e => e.LastName},
},
// Some other properties here that are irrelevant.
}
解决方法:
SortExpression的类型应为Expression< Func< T,object>.
通过使其成为Func< T,object> ;,使编译器将其直接降低到IL,以准备执行. Linq to SQL(或实体,NHibernate或其他任何东西)将需要以表达式树形式捕获的代码,以便将其转换为SQL或其他查询语言以在其他地方执行.通过将您的lambda分配给Expression< Func< ...> ;,您触发编译到表达式树. 放这个可以用吗?
Elements = Elements.OrderBy(e => e.ShippingDate);
那呢?
Expression<Func<OrderViewData, object>> sortExpression = e => e.ShippingDate;
Elements = Elements.OrderBy(sortExpression);
根据更新后的问题,听起来您需要使用静态类型的返回值而不是对象来捕获表达式.
很难知道什么是理想的配置,但是在原始设置代码中,您有:
new Column<OrderViewData>{Key = "ShippingDate", SortExpression = e => e.ShippingDate}
假设Column使用两个类型参数,即TElem(存储在列中的值的类型)和TSort(要排序的值的类型).
new Column<Employee, DateTime?> { SortExpression = e => e.BirthDate }
在我看来,这看起来并不笨拙,然后SortExpression就是:
Expression<Func<TElem, TSort>> SortExpression { get; set; }
内容总结
以上是互联网集市为您收集整理的c#-订购linq查询全部内容,希望文章能够帮你解决c#-订购linq查询所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。