【问题标题】:How to make a class for linq queries (EF)如何为 linq 查询创建一个类(EF)
【发布时间】:2012-09-17 11:06:24
【问题描述】:

首先,我是个新手(菜鸟)。可能我的问题很愚蠢,但我被卡住了。情况如下。

我开始使用 EF 5.0 编写一个 winforms 数据库应用程序。一切都很好,我可以用这样的形式做我想做的事:

private void Form1_Load(object sender, EventArgs e)
{        
    using (var ctx = new pehkEntities())
    {
        var result = from k in ctx.Kolons
                     select new
                     {
                         KolonAdı = k.KolonAdi,
                         En = k.En,
                         Boy = k.Boy,
                         Yükseklik = k.Yukseklik,
                         ID = k.KolonID
                     };


        dataGridView1.DataSource = result.ToList();
    }
}

但是我的 form1 代码现在真的很乱,我想通过使用类和方法来清理它。我试图在 program.cs 中创建一个类和一个方法,但我失败了。 我该如何解决?

public class veritabani_islemleri
{
    public ???? kolonlistele()
    {
    using(pehkEntities ctx = new pehkEntities())



        var result =from k in ctx.Kolons
               select new
               {
                   KolonAdı = k.KolonAdi,
                   En = k.En,
                   Boy = k.Boy,
                   Yükseklik = k.Yukseklik,
                   ID = k.KolonID
               };

        return ????
    }
}

我的问题是我无法填写问号。 我只想在我的表单中这样做。

private void Form1_Load(object sender, EventArgs e)
{
   dataGridview.DataSource=myfunction();  
}

或者如果我的方法完全错误,我应该怎么做?

【问题讨论】:

标签: c# database winforms entity-framework methods


【解决方案1】:

为此:您按照以下步骤操作:-

  1. 创建 ViewModel 类
  2. 并创建表单中需要的属性
  3. 然后创建一个静态方法来处理属性
  4. 然后在您的表单中使用该模型。

例如:

public class  veritabani_islemleriModel{
 public String KolonAdi { get; set; }
 public String En { get; set; }
 public String Boy { get; set; }
 public String Yükseklik { get; set; }
 public String ID { get; set; }
}

and then 
public class veritabani_islemleri
{
    public List<veritabani_islemleriModel> kolonlistele()
    {
    using(pehkEntities ctx = new pehkEntities())



        var result =from k in ctx.Kolons
               select new veritabani_islemleriModel
               {
                   KolonAdı = k.KolonAdi,
                   En = k.En,
                   Boy = k.Boy,
                   Yükseklik = k.Yukseklik,
                   ID = k.KolonID
               };

        return result.Tolist();
    }
}

【讨论】:

  • 谢谢!这解决了我的问题,我学到了很多东西。现在还有一个问题。由于您不懂土耳其语,您将我的变量(En、Boy、Yukseklik)定义为字符串。它们是 int,我将它们定义为 int。但它没有用。出现错误消息:“无法将 int? 转换为 int”或 smt.所以我将它们定义为“int?”。但为什么?在数据库中它们是整数,但在 C# 中是“int?”有什么问题吗?
  • 如果您会看到数据库,那么它是可为空的类型,这就是为什么在实体框架工作类中属性类型是 int 的原因?所以我们必须声明int?输入我们的模型。
  • 是的,我做到了并且工作了。你是对的,它们是可以为空的。谢谢你的帮助!
【解决方案2】:

您当前的 Linq 查询正在返回所谓的“匿名类型”(see here)。在构建时,编译器实际上正在创建一个类来为您保存具有所有正确属性的数据。但是,C# 不能从函数返回匿名类型,这就是为什么你不知道要返回什么类型。

解决这个问题的最好方法是创建自己的真实类来保存数据,这就是 Pushpendra 在他们的回答中所做的:

public class veritabani_islemleriModel{
 public String KolonAdi { get; set; }
 public String En { get; set; }
 public String Boy { get; set; }
 public String Yükseklik { get; set; }
 public String ID { get; set; }
}

现在你有了一个真正的类型veritabani_islemleriModel,你可以在你的方法签名和返回语句中使用它,而不是编译器生成的匿名类型。

【讨论】:

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