【问题标题】:C# creating methods with some kind of submethodsC# 使用某种子方法创建方法
【发布时间】:2016-12-28 15:48:49
【问题描述】:

我想建立自己的 mysql 类。但我对 c# 比较陌生。

所以在我的想法中,我想构建一些类似的东西:

mySqlTool.select("a,b,c").from("foo").where("x=y");

我不知道这是怎么称呼的,实际上我也不知道这是否可能。我的谷歌搜索没有真正的结果。

所以我的问题是:

是否可以像我上面的示例一样做一些事情?

【问题讨论】:

  • 你想要 LINQ + MySQL...看看this question
  • 构建类。每个方法都返回自己。
  • 如果您在命名时设置了子方法。那么扩展方法就是你的朋友。请参阅下面的答案。

标签: c# mysql


【解决方案1】:

创建一个流畅的 api 并不过分复杂。您只需从每个方法中返回该类的当前实例,这样它们就可以按照您在帖子中指定的方式进行链接:

public class MySqlTool
{
    private string _fields, _table, _filters;

    public MySqlTool Select(string fields)
    {
        _fields = fields;
        return this;
    }

    public MySqlTool From(string table)
    {
        _table = table;
        return this;
    }

    public MySqlTool Where(string filters)
    {
        _filters = filters;
        return this;
    }

    public Results Execute()
    {
        // build your query from _fields, _table, _filters
        return results;
    }
}

允许您运行如下查询:

var tool = new MySqlTool();
var results = tool.Select("a, b, c").From("someTable").Where("a > 1").Execute();

【讨论】:

  • 这将允许方法按任何顺序排列,可能会覆盖已经说过的内容等。在我看来,在这种情况下不会很好地工作。
  • @SamiKuhmonen - 订单无关紧要。您只需在调用Execute 时验证该工具是否拥有所有必要的数据。
  • 我认为您误解了构建不脆弱的流畅界面的复杂程度,尤其是对于 C# 的新手而言。例如,萨米的评论就是其中一个原因。
  • @rory.ap - OP 没有说任何关于要求订单或不能再次调用方法的内容。如果是这种情况,可以通过为流程的每个步骤引入不同的接口来轻松执行顺序。同样,不要过于复杂。
  • @SamiKuhmonen - 您正在对 OP 从未提及的行为做出假设。我的示例过于简单,因为我不会为 Stack Overflow 问题重新编写实体框架。增加复杂性也不难,但一个简单的起点是好的。
【解决方案2】:

看起来您正在尝试执行类似于 Linq to SQL 的操作,但使用的是 MySQL。有一个project called LinqConnect 可以做到这一点。我和他们没有任何关系。

您可以像这样使用它(来自 LinqConnect tutorial):

CrmDemoDataContext context = new CrmDemoDataContext();
var query = from it in context.Companies
    orderby it.CompanyID
    select it;

foreach (Company comp in query)
    Console.WriteLine("{0} | {1} | {2}", comp.CompanyID, comp.CompanyName, comp.Country);

Console.ReadLine();

【讨论】:

  • 很高兴知道,但是共享软件让我坚持自己做这件事:D 但谢谢
【解决方案3】:

我个人不是它的忠实粉丝,但如果你只是在学习,它会很有用。 Linq2SQL 可以为您提供一些开箱即用的功能。

如果您希望自己完成此任务。你会想转向extension methods。 c# 中的一项功能,允许您使用静态方法扩展您的类,在基础上进行操作。

我的建议是,如果您正在做自己的数据访问层,那么您应该使用 dapper 之类的东西(由 StackOverflow 的工作人员构建/使用)。它为您提供了一个简单的数据库基础连接包装器。它提供简单的 ORM 功能并为您进行参数化。

我还强烈建议您将密集查询封装在存储过程中。

【讨论】:

    【解决方案4】:

    您要做的是设计a fluent interface,对于刚刚学习 C# 的人来说,这在某种程度上是一个高级概念。我建议您坚持基础知识,直到您有更多经验为止。

    更重要的是,.NET FCL 中已经内置了现有的数据适配器以及更合适的第三方适配器like this one,并且已经使用“LINQ to(数据库)”完成了您尝试做的事情。如果我是你,我不会重新发明轮子。

    【讨论】:

    • 我不是全新的......即使我觉得:D 搜索这个以获得更深入但有时当你不知道你在搜索什么时很难搜索到一些东西:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 2011-02-25
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    相关资源
    最近更新 更多