【问题标题】:Encapsulation and use of LINQ logic in functions using dot notation使用点表示法在函数中封装和使用 LINQ 逻辑
【发布时间】:2020-02-07 20:33:17
【问题描述】:

我已尽力在标题中进行解释,但我正在努力实现为 linq 语句提供“别名”并仍以点表示法使用它们。请允许我进一步解释。

下面我们有一个应用了 linq 语句的列表:

private List<string> _matches;

var output = _matches.Where(x => x.EntityScore == 100).ToList();

我同意这很容易阅读。但是,我希望进一步简化它,尤其是当语句开始变大时。这是 linq 变得比我关心的更长的示例:

private List<string> _matches;

var matchAddressList = _matches.Where(x => x.EntityDetails.Addresses.Any(x => x.Street.Equals(inputObject.Address)
                                                                           && x.StateProvinceDistrict.Equals(inputObject.State)
                                                                           && x.City.Equals(inputObject.City))).ToList();

我要做的是给某些 LINQ 组起别名,然后将该 linq 称为点运算符

例如:

var finalOutput = _matches.perfectMatches().addressMatches(inputObject).someOtherMatchCondition(inputObject)

我认为上面的行很清晰易读。未来的开发者不一定要研究逻辑。他们可以阅读业务域名并了解它的作用。 我想避免以下行,因为我相信前面的代码更干净:

var finalOutput = someOtherMatchCondition(addressMatches(perfectMatches(_matches)));

上一行是我觉得你会如何使用基本级别的函数。但是,我正在努力寻找一种方法来创建别名或将 linq 逻辑封装到 business domain name 中,然后将其用作点运算符。

我已经尝试过表达式主体定义:

public List<string> perfectMatches => _matches.Where(x => x.EntityScore == 100).ToList();

这是否需要扩展另一个类?还是写泛型?还是我可能不知道这样做的标准方法?

【问题讨论】:

标签: c# linq variables chaining


【解决方案1】:

更新:也许这也有帮助:
How to add custom methods for LINQ queries (C#)


它必须是使用点符号的扩展方法。 你的意思是这样的吗。它是伪代码而不是工作。您可能必须尝试使用​​这些类型或尝试某种通用方法:

public class ProductionCode
{
    public void MyMain()
    {
        var myList = new List<EntityThingType>() { .... };

        var newList = myList.PerfectMatches().AddressMatches(myInputObject).ToList();
    }
}

public static class test
{
    public static IEnumerable<EntityThingType> PerfectMatches(this IEnumerable<EntityThingType> myList)
    {
        return myList.Where(x => x.EntityScore == 100);
    }


    public static IEnumerable<EntityThingType> AddressMatches(this IEnumerable<EntityThingType> myList, MyObjectType inputObject)
    {
        return myList.Where(x => x.EntityDetails.Addresses.Any(x => x.Street.Equals(inputObject.Address)
                                                                    && x.StateProvinceDistrict.Equals(inputObject.State)
                                                                    && x.City.Equals(inputObject.City)));
    }
}

【讨论】:

  • 所以我最终确实根据您在此处显示的内容创建了扩展。我不确定如何使它通用。我的意思是我的扩展方法适用于我的特定业务领域。如果能够创建这些点符号别名而不将其附加到任何特定的业务领域,那就太好了。但是,您的帖子和随附的示例非常有帮助。谢谢!
  • @AJLocke 检查答案中的链接。我在那里看到了一些通用的 linq 扩展示例
【解决方案2】:

我认为您正在寻找的是Extension Methods。您可以让perfectMatches() 方法成为一个扩展方法,它接受IEnumerable&lt;string&gt; 并返回相同的值。然后你可以将它们链接在一起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多