繁体   English   中英

LINQ to Entities-实现此目的的最佳方法?

[英]LINQ to Entities - Best way to accomplish this?

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

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

替代文字

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

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;

替代文字

因此,我有两个问题:

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

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

感谢您的协助。 此外,如果您有任何最佳做法可以分享,那就太好了! 我希望我能在您需要协助的情况下详尽地解释这一点。

1)不必使用局部类来修改EF对象,您始终可以创建自己的包含只读属性van_status的类。 您获得的代码几乎相同:

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; }
    }
}
  • 确保将此扩展类放置在与实体类相同的名称空间中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM