我的扩展方法具有以下签名:
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?
答案 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.
}
}