我构建了一个动态搜索linq表达式。
我可以计算List中的记录数,但是如果我将List更改为BindingList,则无法在Lambda表达式中使用Count属性。我收到以下错误:
发生了类型为“System.NotSupportedException”的未处理异常 在EntityFramework.SqlServer.dll
中附加信息:指定的 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表达式工作。
答案 0 :(得分:1)
在最新的EF(v6.1.3)中工作(支持)。
但是,如果你想要安全(并且通常更正确),而不是Count
属性,你应该使用Enumerable.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);
}
答案 1 :(得分:0)
this question的可能副本?
如果您的Count
属性未映射到数据库列,则无法在Where()
命令中使用它。
答案 2 :(得分:0)
查询将在ToList()
语句后执行。将在该点和listResult的分配之前生成错误消息。所以问题必须是lambdaExpression的构造。错误消息表明Linq实现不支持BindingList。您必须将ToList结果转换为BindingList。