LINQ to Entities - 实现这一目标的最佳方式?

时间:2011-01-01 01:23:40

标签: c# linq linq-to-sql linq-to-entities

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

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

alt text

到目前为止我的代码:

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

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

gcVans.DataSource = vans;

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

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;

alt text

所以,我有两个问题:

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

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

感谢您对此提供任何帮助。此外,如果您有任何最佳实践可以分享,那将是非常棒的!我希望我能够彻底解释这一点,因为你需要提供帮助。

2 个答案:

答案 0 :(得分:3)

1)您可以始终创建自己的包含只读属性van_status的类,而不是使用分部类修改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中的代码封装在您自己的方法中,并从您的计时器事件触发中调用它(或者您选择实现定期刷新)。

答案 1 :(得分: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; }
    }
}
  • 请务必将此扩展类放在与实体类相同的命名空间中。