如何制作可用于可查询的可重用条件? [复制]

Posted

技术标签:

【中文标题】如何制作可用于可查询的可重用条件? [复制]【英文标题】:How to make reusable conditions that can be used in queryables? [duplicate] 【发布时间】:2021-11-17 14:32:51 【问题描述】:

所以在一个函数中,我有一个大的可查询对象,我根据其他条件应用了一堆 where 原因。

就像这个例子:

query.Where(i => 
    _context.FicDernierEvt
        .Where(y => y.VteAffaire == null && y.ApvAffaire == null)
        .Select(y => y.IdFicheCrm)
        .Contains(i.Id)
);

我有这个条件_context.FicDernierEvt.Where(y => y.VteAffaire == null && y.ApvAffaire == null).Select(y => y.IdFicheCrm).Contains(i.Id),在我的代码中经常使用。

我想避免在我的代码中出现这一切,所以我尝试制作一个函数:

private bool isProspect(FicFicheCrm ficheCrm)
    return _context.FicDernierEvt
        .Where(y => y.VteAffaire == null && y.ApvAffaire == null)
        .Select(y => y.IdFicheCrm)
        .Contains(ficheCrm.Id);

所以我可以这样使用它:

query.Where(i => isProspect(i));

但它没有用,因为它不应该这样做。

有人知道如何将这样的可重用条件用于可查询对象吗?

【问题讨论】:

【参考方案1】:

我的建议是使用包含谓词的 Where 方法来扩展 LINQ。

如果您不熟悉扩展方法,请考虑阅读Extension Methods Demystified

您懒得告诉我们您在_context.FicDernierEvt 中存储的IQueryable<...> 的类型,但我们假设它是IQueryable<FicDernierEvt>。换句话说,假设 _context.FicDernierEvt 是 FicDernierEvts 的表。

要求过程GetIdFics(TODO:发明专有名称)将IQueryable<FicDernierEvt>作为输入,只保留那些两者都具有空值的ficDernierEvts属性VteAffaireApvAffaire,并从每个剩余的ficDernierEvt 中返回属性ficDernierEvt.IdFic 的值

我不知道IdFic 的类型,但我们假设它是一个int

public static IQueryable<int> GetIdFics(         // TODO: invent proper name
    this IQueryable<FicDernierEvt> source)

    return source.Where(ficDernierEvt => ficDernierEvt.VteAffaire == null
                                      && ficDernierEvt.ApvAffaire == null)
    .Select(ficDernierEvt => ficDernierEvt.IdFic);

就是这样!

用法:

IQueryable<int> myIdFics = _context.FicDernierEvt.GetIdFics();

你说你在很多地方都有这个 Where/Select:

var oldIdFics = _context.FicDernierEvt
    .Where(ficDernierEvt.Date.Year < 2010)
    .GetIdfics();

var invalidIdFics = _context.FicDernierEvt.GetIdFics()
    .Where(idFic => idFic <= 0);

您甚至可以在更复杂的 LINQ 语句中使用它:

IQueryable<FicDernierEvt> unpaidFicDernierEvts = this.GetUnpaidFicDernierEvts();
int customerId = this.GetCustomerId(customerName);
var largestUnpaidCustomerIdFic = unpaidFicDernierEvts
    .Where(unpaidEvt => unpaidEvt.CustomerId == customerId)
    .GetIdFics()
    .Max();
    

【讨论】:

以上是关于如何制作可用于可查询的可重用条件? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Gatsby 具有自己查询的可重用组件

用于数据库访问的可重用函数

React 中的可重用文本字段

React 中样式化组件的可重用性

使用 React Hooks,我如何制作一个可重用的组件和父组件相互利用?

csharp 用于处理.net模型状态的可重用ValidationFilter属性