【问题标题】:C# how to return from linq2sql query back to mainC#如何从linq2sql查询返回到main
【发布时间】:2012-03-21 21:20:23
【问题描述】:

我一直在使用简单的 linq2sql 语句,但对于将它们与类一起使用是新手。我只想将 linq 语句放在 review 类中,并从 frmMain 类中调用它来填充我的组合框。我知道它应该使用一些属性,下面的代码非常错误,但我们将不胜感激。谢谢

public partial class frmMain : Form
{
    Review r = new Review();
    r.getEmp();
    cboEmployee.DataSource = emps
}

class Review : frmMain
{
    private "return type?" getEmp()
    {
        using (DataClasses1DataContext db = new DataClasses1DataContext())
        {
            var emps = (from emp in db.employees
                        where emp.active == true
                        orderby emp.name
                        select emp.name.Substring(0, 20)).ToList();
            return emps;
        }
    }
}

【问题讨论】:

    标签: c# winforms linq-to-sql c#-4.0


    【解决方案1】:

    在这种情况下,返回类型应该是List<string> 或其实现的接口之一。

    您还需要将返回值分配给调用代码中的某些内容:

    Review r = new Review(); 
    var newDataSource = r.getEmp(); 
    cboEmployee.DataSource = newDataSource;
    

    或者干脆

    Review r = new Review(); 
    cboEmployee.DataSource = r.getEmp();
    

    一般来说,方法的返回类型必须是该方法返回的值的类型,或者该值的超类型。您正在返回 ToList() 调用的结果,因此您的方法的返回类型必须与之兼容。

    在您的调用代码中,您似乎对变量范围感到困惑。 emps变量是getEmp方法的局部变量;它在该方法之外不可见。

    因为 getEmp 是在调用它的类以外的类中定义的,所以它必须是 internalpublic,以便调用类可以看到它。或者,只需在 frmMain 类而不是 Review 类中定义 getEmp 方法。你甚至需要一门复习课吗?

    上面的第一个 sn-p 将返回值分配给另一个局部变量(我将其称为 newDataSource 以减少混淆的可能性),然后将该变量的值分配给 cboEmployee.DataSource。第二个样本跳过了中间分配。

    【讨论】:

    • 现在如何使用 get 和 set 保护数据的私密性?
    • @adam355 你想保护哪些数据不公开,你在哪里使用 get 和 set?
    • @adam355 是的,鉴于您的示例有限,将 getEmp 作为 frmEmp 类的私有方法是有意义的。但是,有时您需要使用公共方法!您的示例中最奇怪的部分是 Review 从 frmMain 继承,并且您在 frmMain 类中创建了一个新的 Review 实例。我注意到您发布的 frmMain 示例无法编译,因为其中两行代码需要在方法主体内,但不是。
    • @adam355 通常,您应该将一个类视为具有一项工作(“单一职责原则”)。公共成员应该公开该工作的输入和输出。实现细节应该是私有的(像“生成要放入组合框的字符串列表”这样的任务是一个实现细节)。
    • @adam355 在添加 get/set 属性之前,您需要一个具有可以获取或设置的值的类。你有这样的课吗?您是否坚持为它创建属性?如果是这样,也许最好发布另一个问题。 getEmp 方法可能最好保留为方法,而不是属性(更惯用的名称是 GetEmployeeList,但这是另一回事)。
    【解决方案2】:
    private List<string> getEmp()
    {
        using (DataClasses1DataContext db = new DataClasses1DataContext())
        {
            var emps = (from emp in db.employees
                        where emp.active == true
                        orderby emp.name
                        select emp.name.Substring(0, 20)).ToList();
            return emps;
        }
    }
    

    然后设置DataSourceComboBox

      cboEmployee.DataSource = r.getEmp();
    

    【讨论】:

    • 谢谢!由于保护级别无法访问 getEmp,我应该如何实现属性?
    • @adam355 使方法公开(或内部),而不是私有。
    • 把它公之于众不是糟糕的编程吗?
    • @adam355 我刚刚意识到 Review 继承自 frmMain。这似乎很奇怪。你为什么要那么做?更好的解决方案是将 getEmp 定义为 frmMain 的私有方法。
    • 这似乎很奇怪,因为我是新手,正在学习。所以出于这个原因我没有答案..大声笑你能举个例子吗?
    猜你喜欢
    • 2014-06-20
    • 2021-03-27
    • 2021-01-05
    • 2018-11-12
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多