繁体   English   中英

绑定列表属性的C#Linq表达式

[英]C# Linq Expression on Property of BindingList

我构造一个动态搜索linq表达式。

我可以计算列表中的记录数,但是如果将列表更改为BindingList,则无法在Lambda表达式中使用属性Count。 我收到以下错误:

EntityFramework.SqlServer.dll中发生了'System.NotSupportedException'类型的未处理异常

附加信息:LINQ to Entities不支持指定的类型成员'Count'。 仅支持初始化程序,实体成员和实体导航属性。

这是一个小样本:

public class Toto 
{
BindingList<Tata> tatas; // or List<Tata> tatas;
}

我进行如下查询:

var c = System.Linq.Expressions.Expression.Parameter(typeof(Toto), c);
var member = System.Linq.Expressions.Expression.PropertyOrField(c, "tatas");
var memberCount = System.Linq.Expressions.Expression.PropertyOrField(member, "Count");
var constantValue = System.Linq.Expressions.Expression.Constant(2);
var countExpression = System.Linq.Expressions.Expression.Equal(memberCount, constantValue);
var lambdaExpression = System.Linq.Expressions.Expression.Lambda<Func<Bike, bool>>(countExpression, c);
using (var context = new Context())
{
    var listResult = context.Totos.Where(lambdaExpression).ToList();
    Console.WriteLine(listResult.Count);
}

如果tatas的类型为List,则此代码可以很好地工作,但是我无法弄清楚如何使用BindingList上的Count属性来使lambda表达式起作用。

在最新的EF(v6.1.3)中它正在运行(受支持)。

但是,如果您想保持安全(通常更正确),则应使用Enumerable.Count()方法代替Count属性,该方法肯定会像这样被支持

var c = Expression.Parameter(typeof(Toto), c);
var member = Expression.PropertyOrField(c, "tatas");
var elementType = member.Type.GetInterfaces()
    .Single(t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IEnumerable<>))
    .GetGenericArguments()[0];
var memberCount = Expression.Call(typeof(Enumerable), "Count", 
    new [] { elementType }, member);
var constantValue = Expression.Constant(2);
var countExpression = Expression.Equal(memberCount, constantValue);
var lambdaExpression = Expression.Lambda<Func<Toto, bool>>(countExpression, c);
using (var context = new Context())
{
    var listResult = context.Totos.Where(lambdaExpression).ToList();
    Console.WriteLine(listResult.Count);
}

这个问题的可能副本? 如果您的Count属性未映射到数据库列,则不能在Where()使用它。

该查询将在ToList()语句之后执行。 该错误消息将在该时刻和listResult关联之前生成。 因此,问题一定是lambdaExpression的构造。 该错误信息表明Linq实现不支持BindingList。 您必须将ToList结果转换为BindingList。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM