Linq2Sql和lambda返回"方法'系统.对象DynamicInvoke (System.Obj

本文关键字:DynamicInvoke 对象 Obj System 系统 方法 lambda 返回 quot Linq2Sql | 更新日期: 2023-09-27 18:08:24

为什么…

Func<IQueryable<CampaignCodePaths>> table = () => CampaignCodePaths;
Func<CampaignCodePaths, int> propertySelector = e => e.Id;
int key = 1;
Func<CampaignCodePaths, bool> whereSelector = e => propertySelector(e).Equals(key);
table().Where(whereSelector).FirstOrDefault();

…工作但是…

Func<IQueryable<CampaignCodePaths>> table = () => CampaignCodePaths;
Func<CampaignCodePaths, int> propertySelector = e => e.Id;
int key = 1;
table().Where(e => propertySelector(e).Equals(key)).FirstOrDefault();

…返回例外:

方法的系统。对象DynamicInvoke(System.Object[])'不支持转换为SQL

?

更新

澄清:

CampaignCodePath Get(Func<IQueryable<CampaignCodePaths>> table, Func<CampaignCodePaths, int> selector, int key)
{
    return table().Where(/*How to I create this expression from selector and key? */).FirstOrDefault();
}
...
Get(() => CampaignCodePaths, e => e.Id, 1)

Linq2Sql和lambda返回"方法'系统.对象DynamicInvoke (System.Obj

你的第一段代码在。net中执行所有的过滤,因为你使用的是委托而不是表达式树——它甚至没有尝试将过滤器转换成SQL。换句话说,并不是第一个"行得通",第二个不行——而是第一个没有失败,因为它没有真正尝试做你期望的事情,而第二个却做到了。

第二种形式是调用Queryable.Where(IQueryable<T>, Expression<...>),而第一种形式是调用Enumerable.Where(IEnumerable<T>, Func<...>)

如果您将代码更改为:

Expression<Func<CampaignCodePaths, bool>> filter = e => e.Id.Equals(key);
table().Where(filter).FirstOrDefault();

那么应该没问题。

编辑:回应你的编辑,我认为你想要这样的内容:

CampaignCodePath Get(Func<IQueryable<CampaignCodePaths>> table,
                     Expression<Func<CampaignCodePaths, int> selector>,
                     int key)
{
    Expression equal = Expression.Equal(selector, Expression.Constant(key));
    var lambda = Expression.Lambda<Expression<Func<CampaignCodePaths, bool>>
        (equal, selector.Parameters);
    return table().Where(lambda).FirstOrDefault();
}