标签: linq-expressions

通用 DbDataReader 到 List<T> 映射

我的属性绑定数据访问类有一个小问题(更像是一个烦恼)。问题是当读取器中不存在类中相应属性的列时,映射会失败。

代码

这是映射器类:

// Map our datareader object to a strongly typed list
private static IList<T> Map<T>(DbDataReader dr) where T : new()
{
    try
    {
        // initialize our returnable list
        List<T> list = new List<T>();
        // fire up the lamda mapping
        var converter = new Converter<T>();
        while (dr.Read())
        {
            // read in each row, and properly map it to our T object
            var obj = converter.CreateItemFromRow(dr);
            // add it to our list
            list.Add(obj);
        }
        // reutrn it
        return list;
    } …
Run Code Online (Sandbox Code Playgroud)

c# reflection expression-trees dbdatareader linq-expressions

5
推荐指数
1
解决办法
4155
查看次数

成员表达式无法从可为空的十进制数转换为对象

我正在处理一个 MVC 项目,并希望将一个属性的名称传递给 Html.TextboxFor 方法。这是我的视图模型

public class RuleViewModel<T> where T : class, IValidatableObject
{
    private T _rule;
    public T RuleModel
    {
        get
        {
            return _rule
                ?? (_rule = Activator.CreateInstance<T>());
        }
    }

    public RuleMetadata Metadata { get; set; }

    public Expression<Func<RuleViewModel<T>, Object>> GetParameterByName(PropertyInfo pi)
    {
        var fieldName = Expression.Parameter(typeof(RuleViewModel<T>), "x");
        var fieldExpression = Expression.PropertyOrField(Expression.Property(fieldName, "RuleModel"), pi.Name);
        var exp = Expression.Lambda<Func<RuleViewModel<T>, Object>>(fieldExpression, fieldName);
        return exp;
    }

}
Run Code Online (Sandbox Code Playgroud)

然后在视图中我这样做

  @foreach (var prop in Model.RuleModel.GetType().GetProperties())
    {
        var result = Model.Metadata.Columns.SingleOrDefault(m => m.ColumnName == prop.Name); …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc linq-expressions

5
推荐指数
1
解决办法
998
查看次数

如何更正表达式的替换类型?

我有两个班级:

public class DalMembershipUser
{
        public string UserName { get; set; }
        //other members
}

public class MembershipUser
{
        public string UserName { get; set; }
        //other members
}
Run Code Online (Sandbox Code Playgroud)

我有功能:

    public IEnumerable<DalMembershipUser> GetMany(Expression<Func<DalMembershipUser, bool>> predicate)
    {
      //but here i can use only Func<MembershipUser, bool>
      //so i made transformation
        query = query.Where(ExpressionTransformer<DalMembershipUser,MembershipUser>.Tranform(predicate));
}
Run Code Online (Sandbox Code Playgroud)

当前实现:

public static class ExpressionTransformer<TFrom, TTo>
    {
        public class Visitor : ExpressionVisitor
        {
            private ParameterExpression _targetParameterExpression;

            public Visitor(ParameterExpression parameter)
            {
                _targetParameterExpression = parameter;
            }

            protected override Expression VisitParameter(ParameterExpression …
Run Code Online (Sandbox Code Playgroud)

c# linq-expressions

5
推荐指数
1
解决办法
779
查看次数

更改表达式的返回类型&lt;func&lt;&gt;&gt;

假设我有一个Expression<Func<T,object>>是否可以根据Type变量动态地将返回类型更改为类似Expression<Func<T,int>>

我有以下课程:

public class ImportCheck<T> {

    public int id { get; set; }
    public string Name { get; set; }
    public Type Type { get; set; }
    public bool Required { get; set; }
    public int? MinLength { get; set; }
    public int? MaxLength { get; set; }
    public string Value { get; set; }
    public Expression<Func<T, object>> AssociatedProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个List<ImportCheck<Contact>>循环遍历并为每个Contact对象设置一个属性(属性都是不同的类型)。为了使我能够设置嵌套对象的属性,我需要结果类型与目标类型相同。如果说联系人的所有属性,int那么我现在所拥有的就可以正常工作,这是因为我有一个不同类型的列表,这让我很头疼。

这是我设置子属性的方式:

private static Action<M, …
Run Code Online (Sandbox Code Playgroud)

c# linq-expressions

5
推荐指数
2
解决办法
1965
查看次数

C# 属性是否可以没有 GetMethod 和 SetMethod

浏览 System.Linq.Expressions 的 .NET 核心源代码,我发现以下代码位于此处

MethodInfo mi = property.GetGetMethod(true);
if (mi == null)
{
    mi = property.GetSetMethod(true);
    if (mi == null)
    {
        throw Error.PropertyDoesNotHaveAccessor(property, nameof(property));
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有什么办法GetGetMethod GetSetMethod既可以返回null,因为似乎占了这里?这是死代码吗?C# 编译器不允许属性没有 getter 和 setter,所以这对PropertyInfo.

我的动机是通过添加测试覆盖率来为 OSS 代码做出贡献,所以我想看看哪些测试用例会覆盖这个

c# reflection propertyinfo linq-expressions

5
推荐指数
1
解决办法
387
查看次数

如何创建“ExpressionType.IsTrue/IsFalse”?

长话短说

如何创建一个Expression地点

Expression.NodeType == ExpresionType.IsTrue || ExpresionType.IsFalse
Run Code Online (Sandbox Code Playgroud)

背景信息

我正在创建 EnumerableQuery 的自定义版本,在其中重写所有表达式以处理 Null 检查。因此,当将 EF Linq2Sql 代码作为 Linq2Objects 进行单元测试时,访问的null导航属性不会引发异常,而是优雅地处理它。

我正在尝试对所有成员进行测试ExpressionType。如何创建表达式语法来创建ExpressionType.IsTrueExpressionType.IsFalse节点。

Github 项目:Moqqer

尝试 1.x => x

Where条款:

queryable.Where(x => x.L1.L2.L3.L4.L5.Boolean);
Run Code Online (Sandbox Code Playgroud)

回报

ExpressionType.MemberAccess
Run Code Online (Sandbox Code Playgroud)

尝试 2. x => !(x && y)

以下Where条款:

queryable.Where(x => !(x.L1.L2.L3.L4.L5.Boolean && x.L1.L2.L3.L4.L5.Boolean));
Run Code Online (Sandbox Code Playgroud)

回报

ExpressionType.Not
     ExpressionType.AndAlso
         Left = ExpressionType.MemberAccess
         Right = ExpressionType.MemberAccess
Run Code Online (Sandbox Code Playgroud)

尝试 3.x => true

Where条款

queryable.Where(x => true);
Run Code Online (Sandbox Code Playgroud)

回报

ExpressionType.Constant
Run Code Online (Sandbox Code Playgroud)

评论

我猜测这些ExpressionType …

.net c# expression compilation linq-expressions

5
推荐指数
1
解决办法
934
查看次数

用于创建具有可变数量泛型类型参数的元组的表达式

我正在尝试构建一个表达式,用于创建Tuple<>具有可变数量泛型类型参数的泛型实例。

生成实例的想法Tuple<>是根据具有 a 的属性为实体类型动态创建复合键值KeyAttribute。然后,复合键将用作Dictionary<object, TEntity>. 因此,应该为特定实体类型构建 lambda 表达式,并调用 lambda,传递 的实例TEntity以获取 a 形式的组合键Tuple<>

实体模型示例

public class MyEntityModel
{
    [Key]
    public string Key1 { get; set; }
    [Key]
    public Guid Key2 { get; set; }
    public int OtherProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

应该做什么表情

public Func<MyEntityModel, object> BuildKeyFactory()
{
    // This is how the LambdaExpression should look like, but then for a generic entity type instead of fixed to MyEntityModel …
Run Code Online (Sandbox Code Playgroud)

c# linq-expressions

5
推荐指数
1
解决办法
2050
查看次数

为什么子级重写属性的 MemberExpression 显示父级属性

假设我们有 2 个班级

class A{
   public abstract int Prop1 {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

这是孩子

class Child : A{
   [CustomAttr(someval)] 
   override public int Prop1 {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

所以稍后在我的代码中我需要获取此自定义属性的 val。

bool haveCustomAttr(IExpression<Func<Child, int>> property){
    return ((MemberExpression)property.Body).Member.GetCustomAttributes(typeof(CustomAttr)).Any();
}
Run Code Online (Sandbox Code Playgroud)

所以当我调用这段代码时

haveCustomAttr(c => c.Prop1)
Run Code Online (Sandbox Code Playgroud)

它的返回是false因为((MemberExpression)property.Body).Member它是出于某种原因A.Prop1而不是Child.Prop1

可以用这样更先进的结构来修复

((MemberExpression)property.Body).Expression.Type.GetMember(((MemberExpression)property.Body).Member
                .Name)[0].GetCustomAttributes(typeof(CustomAttr), false).Any(); 
Run Code Online (Sandbox Code Playgroud)

但我仍然不清楚为什么它最初会威胁这个表达式作为基类,如果它明确地说它是来自Child类的表达式。有人能为我解释一下这背后的逻辑吗?

.net c# reflection attributes linq-expressions

5
推荐指数
0
解决办法
188
查看次数

如何忽略 lambda 表达式中转换为可为空的情况?

我正在尝试构建 Odata 表达式的解析器,当字段可为空时,我收到错误。

public class UserRight
{
    public bool? active
}

public void Test(){
    Expression<Func<UserRight, bool>> expression = p => p.Active == true;
}
Run Code Online (Sandbox Code Playgroud)

它生成了以下表达式:

{p => (p.Active == Convert(True, Nullable`1))}
Run Code Online (Sandbox Code Playgroud)

但我想收到它

{p => (p.Active == True)}
Run Code Online (Sandbox Code Playgroud)

为了避免这种“转换”。有没有简单的方法可以做到这一点?因为我的解析器已经准备好了,我不想仅仅因为一个可为空的字段而重建它。

c# expression expression-trees linq-expressions

5
推荐指数
1
解决办法
1877
查看次数

如何从 linq 表达式中获取字符串?

我有这个方法和参数。

void SomeMethod(Expression<Func<Products, bool>> where)
Run Code Online (Sandbox Code Playgroud)

我这样称呼这个方法;

int i = 9;
SomeMethod(x=>x.Id==i)
Run Code Online (Sandbox Code Playgroud)

我希望它产生这个字符串;

"x=>x.Id==9"
Run Code Online (Sandbox Code Playgroud)

如果我只是按原样打印出上面的表达式,它会给我这个字符串:

"x => (x.Id == value(isTakibi.WepApp.Controllers.HomeController+<>c__DisplayClass4_0).i)"
Run Code Online (Sandbox Code Playgroud)

但我需要“x.Id == 9”。我需要评估变量的值,i以便结果为“x.id==9”。

.net c# linq linq-expressions

5
推荐指数
1
解决办法
1403
查看次数