- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用表达式树构建一个 lambda 查询,以使其在整个应用程序中通用。我最初的尝试基于找到的代码 here .我更改了代码,以便它执行比较以返回 100 个实体,这些实体的 LastName 就在 searchText 之前,如下所示:
TEntity entity = entitySet.FirstOrDefault();
string searchName = entity.GetType().GetProperty("SearchName").ToString();
searchText = "Baker";
int records = 100;
IQueryable<TEntity> queryableData = entitySet.AsQueryable<TEntity>();
var param = Expression.Parameter(typeof(TEntity), searchName);
var body = Expression.LessThan(Expression.Call(
typeof(string),
"Compare",
null,
Expression.PropertyOrField(param, searchName),
Expression.Constant(searchText)),
Expression.Constant(0));
var lambda = Expression.Lambda<Func<TEntity, bool>>(body, param);
MethodCallExpression whereCallExpression = Expression.Call(
typeof(Queryable),
"Where",
new Type[] { typeof(TEntity) },
queryableData.Expression,
lambda);
var data = entitySet.AsQueryable<TEntity>().Provider.CreateQuery<TEntity>(whereCallExpression).Take(records);
上面的代码有效,它从位于我的 searchText 之前的数据库中返回 100 个实体,但它们是错误的实体,因为它们在 entitySet 中没有按顺序排列。因此,我的表达式树中需要一个 OrderBy 子句,以便我得到“Azure”、Axel、Avis 等。
我试过这个:
MethodCallExpression orderByCallExpression = Expression.Call(
typeof(Queryable),
"OrderByDescending",
new Type[] { typeof(TEntity), typeof(TEntity) },
whereCallExpression,
Expression.Lambda<Func<TEntity, string>>(param, new ParameterExpression[] { param }));
var data = entitySet.AsQueryable<TEntity>().Provider.CreateQuery<TEntity>(orderByCallExpression).Take(records);
我收到错误消息“System.Core.dll 中出现类型为‘System.ArgumentException’的异常,但未在用户代码中处理
附加信息:类型 MyEntity 的表达式不能用于返回类型“System.String””
堆栈跟踪:
在 System.Linq.Expressions.Expression.ValidateLambdaArgs(类型 delegateType、Expression& body、ReadOnlyCollection`1 参数)
在 System.Linq.Expressions.Expression.Lambda[TDelegate](表达式主体、字符串名称、 bool tailCall、IEnumerable`1 参数)
在 System.Linq.Expressions.Expression.Lambda[TDelegate](表达式主体、 bool tailCall、IEnumerable`1 参数)
所以,我看了here并试过这个:
Expression<Func<TEntity, string>> sortExp = l => l.SearchName);
MethodCallExpression orderByCallExpression = Expression.Call(
typeof(Queryable),
"OrderByDescending",
new Type[] { typeof(TEntity), typeof(string) },
whereCallExpression,
sortExp);
我收到错误消息“mscorlib.dll 中出现类型为‘System.NotSupportedException’的异常,但未在用户代码中处理
其他信息:LINQ to Entities 不支持指定的类型成员“SearchName”。仅支持初始化程序、实体成员和实体导航属性。”
我认为问题在于 SearchName 属性是一个字符串,它包含我想要 OrderBy 的实体上的字段名称。我试过了:
l => (string)l.GetType().GetProperty("SearchName").GetValue(SearchName);
但这给了我错误:“mscorlib.dll 中出现类型为‘System.NotSupportedException’的异常,但未在用户代码中处理
附加信息:LINQ to Entities 无法识别“System.Object GetValue(System.Object)”方法,并且无法将此方法转换为存储表达式。”
TEntity 基于 EntityObject
SearchName 是 TEntity 上的字符串类型的属性,它保存数据库中字段的名称。
entitySet 的类型为 ObjectSet<TEntity>
如有任何建议,我们将不胜感激。
更新和解决方案我找到代码 here这让我想到了不同的方向。以下是用于按 SearchName 进行排序的代码:
var type = typeof(TEntity);
var property = type.GetProperty(searchName);
var parameter = Expression.Parameter(type, "p");
var propertyAccess = Expression.MakeMemberAccess(parameter, property);
var orderByExp = Expression.Lambda(propertyAccess, parameter);
MethodCallExpression orderByCallExpression = Expression.Call(
typeof(Queryable),
"OrderByDescending",
new Type[] { typeof(TEntity), typeof(string) },
whereCallExpression,
Expression.Quote(orderByExp));
var data = entitySet.AsQueryable<TEntity>().Provider.CreateQuery<TEntity>(orderByCallExpression).Take(records);
最佳答案
如果 SearchName 是一个没有存储在你的数据库中的字段,你应该在你的实体模型中忽略它,使用 [ignore] 属性或 this.Ignore(t => t.Property);
流畅的 API。
关于c# - MethodCallExpression orderby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24044924/
我有一个方法Method private static int Method(int n) { return n; } 我在我的 ExpressionVisitor 中覆盖了 VisitMet
如果我有一个方法名称和方法的参数,我如何为该方法创建一个 MethodCallExpression? 这是一个示例方法: public void HandleEventWithArg(int arg)
我正在尝试使用表达式树构建一个 lambda 查询,以使其在整个应用程序中通用。我最初的尝试基于找到的代码 here .我更改了代码,以便它执行比较以返回 100 个实体,这些实体的 LastName
我正在努力让我的用户更方便地使用我的图书馆。 我有一个接口(interface) I 和一个类 A ... public interface I { int f(int i); } publi
我正在尝试使用 ExpressionVisitor 来修改调用方法的表达式,但未能成功。我有一个 SearchService 封装了搜索逻辑,并希望能够修改传递的搜索参数。 应修改并运行 Search
我正在尝试实现以下代码: db.Invoices.Where(x => Dimensions.All(y => x.DimensionSet.Entries.Any(dim => (d.Dimensi
我正在玩 Roslyn CTP nuget 包,我想我会熟悉 SyntaxVisitor<>类,所以我正在创建一个 Roslyn.Compilers.CSharp.SyntaxNode至 System
我正在尝试学习表达式树,并且我创建了一个方法 Expression> 如果满足某些条件则执行它 - 请参阅下面的代码。 private static void TryCommand(E
如何获取 MethodCallExpression 的参数值? 今天我这样做了,但是速度不够快: private static object GetArgumentValue(Expression e
我有一个带有 select 的 Linq 查询,从我的 Linq 查询提供程序那里我得到一个包含 MethodCallExpression 的表达式树,但只是如何从 MethodCallExpress
我希望使用表达式树创建以下 Linq 表达式: var result2 = soldiers.OrderByDescending(soldier => soldier.Ranks.OrderBy(r=
我有一个查询,我需要对其应用 n 个过滤器。但是我必须使用表达式。到目前为止,我已经为每个过滤器构造了表达式,效果很好。问题是我想将这些过滤器连接到一个表达式中,这样我就可以将它用作 LINQ 的 .
无论维度如何,索引数组都是一种方法调用,因为它涉及调用索引器运算符。 那为什么方法重载了System.Linq.Expressions.Expression.ArrayIndex那takes a si
我有一个 MethodCallExpression 包含这样的日期调用 DateTime.UtcNow.AddDays(-10); 我希望能够将其编译成它所代表的实际日期,但由于我使用的是 Xamar
这是一个打印MethodCallExpression 方法签名的简单应用程序: using System; using System.Linq; using System.Linq.Expressio
在为 GET 请求执行之前,我需要向 MethodCallExpression 添加参数 这是加载所有员工的 OData GET 请求: server/employees?$filter=birthd
我正在尝试创建一个带有方法调用的通用表达式 Enumerable.Contains 所以基本上我想实现这个简单的 lambda x => collection.Contains(x.SomePrope
给定以下类: public class MyClass { private readonly UrlHelper _urlHelper; // constructor left out
以下代码抛出此异常的原因是什么,说“表达式必须是 MethodCallExpression。我认为调用 Action 是...... Action startBouncePolling =
我有一个处理 MethodCallExpression 的自定义 LINQ 提供程序有一个 OrderBy其中的子句。我怎样才能得到 OrderBy条款以便我可以处理它? 最佳答案 我想通了,这是方法
我是一名优秀的程序员,十分优秀!