gpt4 book ai didi

c# - 订购 linq 查询

转载 作者:行者123 更新时间:2023-11-30 15:50:09 30 4
gpt4 key购买 nike

对于我的通用网格,我目前这样做是为了激活排序:

Elements.OrderBy(column.SortExpression).AsQueryable();

其中SortExpression类型为 Func<T, object>列是一个通用类 Column<T>

我在这样的 Controller 中设置 SortExpression:

new Column<OrderViewData>{Key = "ShippingDate", SortExpression = e => e.ShippingDate}

'OrderBy' 导致执行 sql 语句,这是我不希望的。

所以我试图用这个替换它:

Elements = from element in Elements
orderby column.SortExpression
select element;

这不会触发 sql 执行。

现在当然是专栏SortExpression应该是另一种类型。只是我无法真正弄清楚它应该是什么类型以及如何在 Controller 的泛型类上设置它。

我应该仍然能够设置 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: Cannot order by type 'System.Object'

现在,您可能会说:“那么只需使用 DateTime 吗?”,但我希望在我的通用网格中构建列以尽可能减少代码量。我不希望人们必须键入整个 Expression<Func<Employee, some_type>> .我希望人们能够像我的第一次尝试一样只输入一些小东西 SortExpression = e => e.BirthDate ,我利用通用 Column 类来定义“T”。

你认为有可能创建某种扩展以某种方式获得 e.BirthDate 的类型吗?然后转换 Func<T, object>Expression<Func<T,some_type>> ?然后我可以在内部代码中做一些事情,比如:元素.OrderBy(列.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);

根据您更新的问题,听起来您需要捕获具有静态类型返回值的表达式,而不是 object .

很难知道什么是您的理想安排,但在您的原始设置代码中您有:

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 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/914681/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com