C# LINQ到实体-实现这一点的最佳方法?

C# LINQ到实体-实现这一点的最佳方法?,c#,linq,linq-to-sql,linq-to-entities,C#,Linq,Linq To Sql,Linq To Entities,好的,我主要是一个LAMP开发人员,所以我是实体框架的新手。但是,我熟悉LINQ中的基础知识,并且已经从我的数据库生成了一个实体模型。下面是我的要求: 我在WinForm上有一个datagrid,当从其他源对数据集进行更改时,它每隔几秒钟就会从远程服务器上的数据源刷新一次。显然,我想构造一个lambda表达式来获得正确的匿名类型,以满足需要在我的datagrid中显示的列。我已经这样做了,结果如下(顺便说一句,我使用的是自定义datagrid控件): 到目前为止,我的代码是: Models.d

好的,我主要是一个LAMP开发人员,所以我是实体框架的新手。但是,我熟悉LINQ中的基础知识,并且已经从我的数据库生成了一个实体模型。下面是我的要求:

我在WinForm上有一个datagrid,当从其他源对数据集进行更改时,它每隔几秒钟就会从远程服务器上的数据源刷新一次。显然,我想构造一个lambda表达式来获得正确的匿名类型,以满足需要在我的datagrid中显示的列。我已经这样做了,结果如下(顺便说一句,我使用的是自定义datagrid控件):

到目前为止,我的代码是:

Models.dataEntities objDB = new Models.dataEntities();

var vans = from v in objDB.vans
           select v;

gcVans.DataSource = vans;
好的,现在我有了我的基本数据集。我遇到的一个问题是,“Status”列将根据数据集中的几个参数显示一个计算字符串。我通过一个分部类将其添加到实体中。正如您在屏幕截图中所看到的,这是正常工作的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication1.Models {

    public partial class van {

        public string van_status {

            get {

                if (this.is_offline == 1) {

                    return "Offline";

                } else if (this.is_prayer_room == 1) {

                    return "In Prayer Room";

                } else {

                    return "TODO: Create statuses";

                }

            }

        }

    }

}
这个附加属性可以正常工作。但是,当我尝试以匿名类型投影状态以便也可以检索学校名称时,我得到一个错误:

Models.dataEntities objDB = new Models.dataEntities();

var vans = from v in objDB.vans
           select new {

               van_name = v.van_name,
               school_name = v.school.school_name,
               capacity = v.capacity,
               phone = v.phone,
               van_status = v.van_status

           };

gcVans.DataSource = vans;

因此,我有两个问题:

1) 如果我不能在LINQ投影中使用我的分部类的计算属性,我应该如何在我的datagrid中显示我的计算字符串

2) 我的做法正确吗?当我解析#1时,我将如何刷新此数据(即在计时器触发事件期间)?我是否只需调用
objDB.refresh()
,然后告诉我的datagrid从数据源进行更新?调用该方法实际上是运行上面的lambda表达式,还是从DB加载所有内容

谢谢你在这方面的帮助。此外,如果您有任何最佳实践可以分享,那将是非常棒的!我希望在您需要提供帮助时,我已经详细解释了这一点。

1)您可以创建自己的包含只读属性vanu状态的类,而不是使用分部类修改EF对象。您得到的代码几乎相同:

Models.dataEntities objDB = new Models.dataEntities();
gcVans.DataSource = from v in objDB.vans
           select new DisplayVan {
               van_name = v.van_name,
               school_name = v.school.school_name,
               capacity = v.capacity,
               phone = v.phone,
           };
van_status属性是只读的,因此无需在查询中指定

2) 我更像是一个web开发人员,而不是桌面开发人员,因此我将向您介绍如何刷新网格(对于胖客户机来说,这可能不是首选方法)


我不愿意信任.Refresh()方法,希望所有方法都能以最大效率正常工作。相反,将来自#1的代码封装在您自己的方法中,并从计时器事件触发中调用它(或者以您选择的方式实现定期刷新)。

另一个好的选择是创建扩展方法

下面是一个简单的例子:

using System;

namespace WindowsFormsApplication1 {
    static class Program {
        [STAThread]
        static void Main() {
            Van van = new Van();
            string status = van.GetStatus();
        }
    }

    public static class VanExtension {
        public static string GetStatus(this Van van) {
            if(van.is_offline == 1) {
                return "Offline";
            }
            else if(van.is_prayer_room == 1) {
                return "In Prayer Room";
            }

            return "TODO:  Create statuses";
        }
    }

    public class Van {
        public int is_offline { get; set; }
        public int is_prayer_room { get; set; }
    }
}
  • 请确保将此扩展类与实体类放在同一命名空间中

Tahbaza-感谢您澄清这一点。我忘记了将项目转换为自定义类型的功能。这太神奇了。还有一个问题,在自定义类型“DisplayVan”中,我是否需要对该类执行任何特殊的操作,或者它只是一个简单的日常C#类?(即我是否需要实现任何东西才能使其工作?)在该类中,我是否需要定义每个属性,或者它是否可以以某种方式继承实体属性?我只需要将其设置为“POCO”对象,只是所需属性的列表。该类不需要继承任何内容。EF应该有一个POCO实现,它刚刚开始(或者很快就会)起作用,但在此期间,我只是创建了4个与EF对象无关的必需属性。一旦POCO EF实体功能正常且稳定,当我必须使用EF而不是NHibernate时,我也将切换到它们。谢谢,最后一个问题。你能告诉我在哪里可以读到更多关于EF POCO对象状态的信息吗?这些链接:和已经过时,但是Scott Gu的博客值得关注。可以在这里浏览官方MS版本,但您已经接触到了这项技术的问题:迄今为止分散的示例/文档。。。在它发布和最佳实践发布之前,为什么要在生产中使用它?享受C#!为什么不使用匿名类型呢?我可以将网格列绑定到GetStatus()方法吗?