3

我有需要以下参数的方法:

public IQueryable<TEntity> GetAllIncluding(params Expression<Func<TEntity, object>>[] includeProperties)
{
    foreach (var includeProperty in includeProperties)
    {
        dbSet.Include(includeProperty);
    }
    return dbSet;
}

这是我传递参数的方式:

IQueryable<User> users = repo.GetAllIncluding(u => u.EmailNotices, u => u.EmailTemplatePlaceholders, u => u.Actions);

但是,我需要能够在传递或不传递某些条件之前检查它们。

例如,如果我有一个变量useEmailNotices = false,那么我不想传入,EmailNotices但如果是,true那么我会这样做。我需要为这三个人都这样做。我知道要做到这一点还有很长的路要走,但我希望有一条短线或参数构建器功能或类似性质的东西。

4

2 回答 2

4

如何将方法的签名更改为

public IQueryable<TEntity> GetAllIncluding(IEnumerable<Expression<Func<TEntity, object>>> includeProperties)

在别处定义你的条件逻辑

var args = new List<Expression<Func<TEntity, object>>>();
if (useEmailNotices)
    args.Add(u => u.EmailNotices);

然后简单地调用方法

IQueryable<User> users = repo.GetAllIncluding(args);
于 2014-02-14T16:38:24.687 回答
2

List<T>使用您希望传入的实际实体声明的 , 而不是 Params :

var funcList = new List<Expression<Func<User, object>>>();

funcList.add(u => u.EmailTemplatePlaceholders);

if (useEmailNotices)
    funcList.add(u => u.EmailNotices);

方法签名现在是:

public IQueryable<TEntity> GetAllIncluding(List<Expression<Func<TEntity, object>> includeProperties)
{
    foreach( ... )
}
于 2014-02-14T16:40:49.133 回答