Tag: 表达式

具有匿名类型的C#LINQ构建表达式

我有代码只使用一个属性“名称”构建列表。 如何修改代码,以便它可以构建具有两个属性“Name”和“Test_Result”的列表我知道匿名类型可以用来执行此操作,但是如何将它们用于动态表达式? 这是我的代码: string item = “Name”; string item2 = “Test_Result”; Type studentType = typeof(Student); ParameterExpression itemParam = Expression.Parameter(studentType, item); MemberInfo itemProperty = studentType.GetProperty(item); MemberExpression valueInItemField = Expression.MakeMemberAccess(itemParam, itemProperty); Expression<Func> selectExpression = Expression<Func> .Lambda<Func>(valueInItemField, itemParam); IEnumerable currentItemFields = DeserializedStudents.Select(selectExpression.Compile());

使用查询表达式对List 进行排序

我使用Linq订购这样的结构时遇到问题: public class Person { public int ID { get; set; } public List Attributes { get; set; } } public class PersonAttribute { public int ID { get; set; } public string Name { get; set; } public string Value { get; set; } } 一个人可能会这样: PersonAttribute Age = new PersonAttribute { ID = […]

具有OR子句的lambda表达式的LINQ where子句和返回不完整结果的空值

问题简而言之 我们在Where子句中使用了lambda表达式,它没有返回“预期”结果。 快速摘要 在analyzeObjectRepository对象中,某些对象也包含名为Parent的属性中的父关系。 我们正在查询此analyzeObjectRepository以返回一些对象。 详情 下面的代码应该做的是,返回包含ID值的特定对象的根,第一个子节点(直接子节点)和孙子节点。 在下面的代码中,常识说所有使3个单独的OR条件中的任何一个成为真的结果都应该像结果一样返回。 List analysisObjects = analysisObjectRepository .FindAll() .Where(x => x.ID == packageId || x.Parent.ID == packageId || x.Parent.Parent.ID == packageId) .ToList(); 但上面的代码只返回子孙,而没有返回根对象(使用null父值) x.ID == packageId 条件是真的。 只有制作第二个的对象 x.Parent.ID == packageId 第三 x.Parent.Parent.ID == packageId 条款被退回。 如果我们只编写代码以使用下面的代码返回根对象,则返回它,因此我们完全确定analyzeObjectRepository包含所有对象 List analysisObjects = analysisObjectRepository .FindAll() .Where(x => x.ID == packageId ) .ToList(); 但是,当我们将其重写为委托时,我们得到预期的结果,返回所有预期的对象。 […]

使用Expression创建具有嵌套类的谓词

我有这个 : public class Company { public int Id { get; set; } public string Name { get; set; } } public class City { public int Id { get; set; } public string Name { get; set; } public int ZipCode { get; set; } } public class Person { public int Id { […]

使用对象初始值设定项创建实例的表达式

有没有办法用对象初始化器和表达式树创建对象的实例? 我的意思是创建一个表达式树来构建这个lambda: // my class public class MyObject { public bool DisplayValue { get; set; } } // my lambda: var lambda = (Func) (displayValue => new MyObject { DisplayValue = displayValue }); 如何使用表达式树创建此lambda? 更新: 我试着自己编写以下代码: public static Func Creator; static void BuildLambda() { var expectedType = typeof(MyObject); var displayValueParam = Expression.Parameter(typeof(bool), “displayValue”); var ctor […]

使用Expression.AndAlso()在C#中分割表达式会导致exception

在我用C#编写的项目中,我发现了一个在linq的这个方法中使用的巨大谓词: public static IQueryable Where(this IQueryable source, Expression<Func> predicate); 这个谓词运作得很完美,但它在很多条件下我在理解它之前经常挣扎。 我想让它变得可读。 所以我写了几个表达式。 但我有一个像这样的运行时exception: 可怕的“参数未绑定在指定的LINQ to Entities查询表达式”exception 我想尝试答案,但我仍然不明白为什么参数(c)是一个问题,请参阅: // in a method Func<string, Expression<Func>> expr1 = (query) => return (c) => … ; Func<string, Expression<Func>> expr2 = (query) => return (c) => … ; var expr = Expression.AndAlso(expr1(“a string”).Body, expr2(“same string”).Body); return Expression.Lambda<Func>(expr , expr1(“a string”).Parameters[0]); […]

在对象初始化期间添加事件处理

我需要将某种类型的实例(将在此刻创建)传递给方法。 这种类型提供了我想订阅的几个事件,所以我的代码如下所示: var instance = new Instance(); instance.OnEvent1 += (sender, args) => { DoThis(); DoThat(); } instance.OnEvent2 += (sender, args) => DoThisToo(); instance.OnEvent3… MyMethod(instance); 现在,是否可以在初始化期间添加处理程序? 所以我可以这样写: MyMethod((MyType)instance => { instance.OnEvent1 += (sender, args) => { DoThis(); DoThat(); } instance.OnEvent2… }); 当然,由于美容原因,这仅是期望的。 我喜欢我的代码小而且可读。

在XAML中使用矩形形状作为剪辑

有没有办法可以使用普通的Rectangle(形状)作为XAML中另一个对象的剪辑的一部分。 看起来我应该能够,但解决方案正在逃避我.. 我知道我可以使用’RectangleGeometry’类型的方法,但我对上面提到的代码方面的解决方案更感兴趣。

C#条件运算符错误只有赋值,调用,递增,递减,等待和新对象表达式才能用作语句

嗨,我正在编写一个基本程序来查找输入数字是否为素数。 我有一个checkPrime(num)函数检查素数,如果num是prime则返回true ,else返回false 。 现在在我的main()函数中,我使用条件运算符来缩短代码但是我收到一个我不确定的错误。 以下是我的代码: static void Main(String[] args) { int n = Int32.Parse(Console.ReadLine()); while (n– > 0) { int num = Int32.Parse(Console.ReadLine()); (checkPrime(num) == true) ? Console.WriteLine(“Prime”) : Console.WriteLine(“Not Prime”); } } 当我编译时,我得到错误,因为Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement在条件语句行的while循环中Only assignment, call, increment, decrement, await, […]

Expression.Call – 调用linq扩展名:FirstOrDefault,Where

我试图动态创建以下,但我在调用扩展方法FirstOrDefault时遇到问题: using(var context = new Entities()) { var list = context.Engines.Include(“Cars”).Select(e => e.Cars.FirstOrDefault()).ToList(); } 我有以下内容 Expression parameter = Expression.Parameter(typeof(Engine), “e”); Expression property = Expression.Property(parameter, “Cars”); 参数= {e} property = {e.Cars} 这些都很好,但是当我尝试调用FirstOrDefault方法时遇到问题: var result = Expression.Call(typeof(Queryable), “FirstOrDefault”, new type[] { typeof(Car)}, property); 我想得到 result = {e.Cars.FirstOrDefault()} 但我得到一个InvalidOperationException 类型’System.Linq.Queryable’上没有通用方法’FirstOrDefault’与提供的类型参数和参数兼容。 如果方法是非generics的,则不应提供类型参数。 任何帮助将非常感激。