如果我有产品.
var p = new Product { Price = 30 };
Run Code Online (Sandbox Code Playgroud)
我有以下linq查询.
var q = repo.Products().Where(x=>x.Price == p.Price).ToList()
Run Code Online (Sandbox Code Playgroud)
在IQueryable提供程序中,我得到一个包含常量表达式的p.Price的MemberExpression,但是我似乎无法从它获得值"30".
更新 我试过这个,但它似乎不起作用.
var memberExpression = (MemberExpression)GetRootConstantExpression(m);
var fi = (PropertyInfo)memberExpression.Member;
var val = fi.GetValue(((ConstantExpression)memberExpression.Expression).Value, null);
Run Code Online (Sandbox Code Playgroud)
干杯.
我刚刚开始使用表达式树,所以我希望这是有道理的.我正在尝试创建一个表达式树来表示:
t => t.SomeProperty.Contains("stringValue");
Run Code Online (Sandbox Code Playgroud)
到目前为止我有:
private static Expression.Lambda<Func<string, bool>> GetContainsExpression<T>(string propertyName, string propertyValue)
{
var parameterExp = Expression.Parameter(typeof(T), "type");
var propertyExp = Expression.Property(parameter, propertyName);
var containsMethodExp = Expression.*SomeMemberReferenceFunction*("Contains", propertyExp) //this is where I got lost, obviously :)
...
return Expression.Lambda<Func<string, bool>>(containsMethodExp, parameterExp); //then something like this
}
Run Code Online (Sandbox Code Playgroud)
我只是不知道如何引用String.Contains()方法.
帮助赞赏.
我想知道在内部包装代表之间究竟有什么区别Expression<>?
我看到Expression<Foo>LinQ使用了很多,但到目前为止,我还没有找到任何解释它之间差异的文章,只是使用了一个委托.
例如
Func<int, bool> Is42 = (value) => value == 42;
Run Code Online (Sandbox Code Playgroud)
与
Expression<Func<int, bool>> Is42 = (value) => value == 42;
Run Code Online (Sandbox Code Playgroud) IQueryable<Organization> query = context.Organizations;
Func<Reservation, bool> predicate = r => !r.IsDeleted;
query.Select(o => new {
Reservations = o.Reservations.Where(predicate)
}).ToList();
Run Code Online (Sandbox Code Playgroud)
此查询引发"内部.NET Framework数据提供程序错误1025"异常,但下面的查询不会.
query.Select(o => new {
Reservations = o.Reservations.Where( r => !r.IsDeleted)
}).ToList();
Run Code Online (Sandbox Code Playgroud)
我需要使用第一个,因为我需要检查一些if语句来构造正确的谓词.我知道在这种情况下我不能使用if语句,这就是我将委托作为参数传递的原因.
如何使第一个查询起作用?
.net c# entity-framework expression-trees entity-framework-4
当我第一次输入这个问题时,我这样做是为了找到重复的问题,确信有人必须已经问过这个问题.我的计划是遵循这些欺骗链接而不是发布此问题.但据我所知,这个问题以前没有被问过......它没有出现在"相关问题"列表中.
为了深入了解C#中的表达式树,你找到了哪些最好的资源(文章,书籍,博客文章等)? 我一直对他们的能力感到惊讶,现在我正处在我说的地方,"好吧,足够的惊喜.我现在想停下来获得这些东西的博士学位." 我正在寻找系统,有条理地涵盖功能的材料,然后详细介绍了如何使用它们.
注意:我不是在谈论lambda表达式.我在谈论Expression <T>以及随之而来的所有事情.
谢谢.
在我目前正在处理的应用程序中,每个业务对象有两种:"ActiveRecord"类和"DataContract"类.例如,会有:
namespace ActiveRecord {
class Widget {
public int Id { get; set; }
}
}
namespace DataContract {
class Widget {
public int Id { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
数据库访问层负责在系列之间进行转换:您可以告诉它更新a DataContract.Widget,它将神奇地创建ActiveRecord.Widget具有相同属性值的数据并保存它.
尝试重构此数据库访问层时,问题浮出水面.
我想在数据库访问层中添加如下方法:
// Widget is DataContract.Widget
interface IDbAccessLayer {
IEnumerable<Widget> GetMany(Expression<Func<Widget, bool>> predicate);
}
Run Code Online (Sandbox Code Playgroud)
以上是一个简单的通用"get"方法,带有自定义谓词.唯一感兴趣的是我传递的是表达式树而不是lambda,因为IDbAccessLayer我在里面查询一个IQueryable<ActiveRecord.Widget>; 为了有效地做到这一点(想想LINQ to SQL)我需要传入一个表达式树,所以这个方法只是要求.
障碍:参数需要从一个神奇地转换Expression<Func<DataContract.Widget, bool>>为一个Expression<Func<ActiveRecord.Widget, bool>>.
我想在里面做的GetMany是:
IEnumerable<DataContract.Widget> GetMany(
Expression<Func<DataContract.Widget, bool>> predicate)
{
var lambda = …Run Code Online (Sandbox Code Playgroud) 我正在试图弄清楚如何将所有部分组合在一起,并希望从一个简单的案例开始的具体源代码示例.
考虑以下C#代码:
Func<int, int, int> f = (x, y) => x + y;
Run Code Online (Sandbox Code Playgroud)
我可以使用表达式树在运行时生成等效函数,如下所示:
var x = Expression.Parameter(typeof(int), "x");
var y = Expression.Parameter(typeof(int), "y");
Func<int, int, int> f =
Expression.Lambda<Func<int, int, int>>(
Expression.Add(x, y),
new[] { x, y }
).Compile();
Run Code Online (Sandbox Code Playgroud)
现在给出以下lambda:
Func<dynamic, dynamic, dynamic> f = (x, y) => x + y;
Run Code Online (Sandbox Code Playgroud)
如何使用表达式树(并且,大概Expression.Dynamic)生成等效的?
我有一个处理表达式树的库.该库需要与C#和VB.Net一起使用
注意到语言之间关于如何构造表达式树的一些差异
字符串比较
() => "a" == "b"变Expression.Equals("a", "b")
Function() "a" = "b"变Expression.Equals(Expression.Call(CompareString, "a", "b"), 0)
(我明白为什么VB.Net使用此处CompareString)
字符串连接
() => "a" + "b"变得Expression.Add("a", "b", String.Concat)
Function() "a" & "b"变得Expression.Call(String.Concat, "a", "b")
优化?
() => !(1 == 2)变得Expression.Not(Expression.Equals(1, 2))
Function() Not (1 = 2)变得Expression.NotEqual(1, 2)
我的图书馆处理所有这些差异,但是我需要注意更多的差异吗?
编辑 我的代码所做的一些解释.
我使用的系统有一个过滤器,您可以像这样指定文档:
var filter = document.Filter;
filter.LeftParanthesis();
filter.Column(columnNumber);
filter.Equals();
filter.Value("abc");
filter.RightParanthesis();
filter.And();
filter.LeftParanthesis();
...
document.Refresh();
Run Code Online (Sandbox Code Playgroud)
为了更容易使用过滤器,我的代码允许您将过滤器指定为Expression<Func<bool>>lambda.
Expression<Func<bool>> filter = …Run Code Online (Sandbox Code Playgroud) 我想使用表达式树动态生成以下select语句:
var v = from c in Countries
where c.City == "London"
select new {c.Name, c.Population};
Run Code Online (Sandbox Code Playgroud)
我已经研究出如何生成
var v = from c in Countries
where c.City == "London"
select new {c.Name};
Run Code Online (Sandbox Code Playgroud)
但我似乎无法找到一个构造函数/重载,让我在select lambda中指定多个属性.