具有两个IN参数的Lambda表达式,具有单个IN参数的Lambda表达式

时间:2014-06-23 13:29:09

标签: c# linq generics lambda

我的扩展方法具有以下签名:

public static class GenericSeeder
{
    public static void Seed<TSeed, TEntity>(this DbContext context, IEnumerable<TSeed> seeds, Expression<Func<TEntity, TSeed, bool>> predicate)
    {
        // code that I'm looking for goes here
    }
}

为了更好地了解该方法的用途,请参考以下内容:

context.Seed<SeedClass, EntityClass>(seeds, (entity, seed) => entity.Name == seed.OtherProperty);

基本上,我使用谓词检查种子是否已经应用。但是,为了进行检查,我必须使用从Linq到Entities的Where或FirstOrDefault,它将以下参数作为参数:

Expression<Func<TEntity, bool>> predicate

所以我的lambda表达式是2 IN参数(TSeed,TEntity)和1 OUT参数(bool)的函数。我需要迭代提供的TSeed对象集合,并为每个对象使用该对象作为我的lambda表达式的参数,以生成LINQ 2实体lambda表达式,其具有1个IN参数(TEntity)和1个OUT参数(bool)。

有没有办法部分调用lambda expression / func来获取另一个lambda表达式/ func?

3 个答案:

答案 0 :(得分:1)

通过使用LINQKit来允许以这样的方式调用表达式,使得它们将被转换为其他表达式,您的方法的实现变得相当简单:

public static IQueryable<TEntity> Seed<TSeed, TEntity>(
    this DbContext context,
    IEnumerable<TSeed> seeds,
    Expression<Func<TEntity, TSeed, bool>> predicate)
{
    return context.Set<TEntity>()
            .AsExpandable()
            .Where(entity => seeds.Any(seed => predicate.Invoke(entity, seed)));
}

答案 1 :(得分:0)

我不知道你在做什么,但这就是你在c#中部分应用的方式:

Func<int,bool, string> twoInFunc= (int a, bool b) => a.ToString() + b.ToString();

int number = 7;

Func<bool, string> oneInFunc= (bool b) => twoInFunc(number,b);

答案 2 :(得分:0)

我设法自己创建解决方案。然而,我确实使用了臭名昭着的LinqKit扩展库及其AsExpandable()扩展方法。

LinqKit可以在这里找到:NuGet link

所以这是与Linq 2实体一起使用的实现:

public static void Seed<TSeed, TEntity>(this DbContext context, IEnumerable<TSeed> seeds, Expression<Func<TEntity, TSeed, bool>> predicate)
            where TEntity : class
            where TSeed : class
        {
            foreach (TSeed seed in seeds)
            {
                Expression<Func<TEntity, bool>> matchExpression = (entity) => predicate.Invoke(entity, seed);
                TEntity existing = context.Set<TEntity>().AsExpandable().FirstOrDefault(matchExpression);

            // Rest of code is omitted as it is not related to the original question.
            // The query above is properly executed by Linq 2 Entities.
            }
        }