实体框架MVC如何使用内部联接?

时间:2018-09-06 07:22:32

标签: c# .net join linq-to-sql devexpress

我正在尝试使用DevExpress mvc开发一个项目。我使用实体框架进行数据库连接。 我想要做的是将两个表与c表中的companyId和k表中的guId结合在一起

我想做什么; https://ekitapdfindir.com/istek.png

我的索引视图;

@(Html.DevExtreme().DataGrid<plate_logs>()
        .ShowBorders(true)
        .DataSource(d => d.WebApi().Controller("PlateLogs").Key("Guid"))
        .Columns(columns =>
        {
            columns.AddFor(m => m.Guid).Width(100);
            columns.AddFor(m => m.LastUpdateDate).Width(90);
            // Columns Location ID
            columns.AddFor(m => m.LocationId)
                .Lookup(lookup =>
                    lookup
                    .DataSource(d => d.WebApi()
                        .Controller("Locations")
                        .LoadAction("Get")
                        .Key("adsad"))
                    .DisplayExpr("Name")
                    .ValueExpr("Guid"));
            // Columns Gate ID
            columns.AddFor(m=>m.GateId)
                .Lookup(lookup => lookup
                    .DataSource(d => d.WebApi()
                        .Controller("Gates")
                        .LoadAction("Get")
                        .Key("GateId"))
                    .DisplayExpr("Name")
                    .ValueExpr("Guid"));
            // Columns Departmant ID
            columns.AddFor(m => m.DepartmentId)
               .Lookup(lookup => lookup
                   .DataSource(d => d.WebApi()
                       .Controller("Departments")
                       .LoadAction("Get")
                       .Key("DepartmentId"))
                   .DisplayExpr("Name")
                   .ValueExpr("Guid"));
            // Columns Driver ID 
            columns.AddFor(m => m.DriverId)
               .Lookup(lookup => lookup
                   .DataSource(d => d.WebApi()
                       .Controller("Driver")
                       .LoadAction("Get")
                       .Key("DriverId"))
                   .DisplayExpr("FullName")
                   .ValueExpr("Guid"));

            // Columns Company ID    
            columns.AddFor(m => m.DriverId)
               .Lookup(lookup => lookup
                   .DataSource(d => d.WebApi()
                       .Controller("Driver")
                       .LoadAction("Gets"))
                   .DisplayExpr("Name")
                   .ValueExpr("Guid"));

        })
        .Paging(p => p.PageSize(20))            
    )
)

我的驱动程序控制器;

        LCWCENTEREntities db = new LCWCENTEREntities();
        [HttpGet]
        public HttpResponseMessage Get(DataSourceLoadOptions loadOptions)
        {
            var model = db.driver.ToList();
            return Request.CreateResponse(DataSourceLoader.Load(model, loadOptions));
        }
        [HttpGet]
        public HttpResponseMessage Gets(DataSourceLoadOptions loadOptions)
        {
            var sorgu = from d in db.driver
                        join c in db.company
                        on d.CompanyId equals c.Guid
                        select  new {d,c };
            return Request.CreateResponse(DataSourceLoader.Load(sorgu, loadOptions));
        }

gets操作将驱动程序表连接到company表,并将数据发送到查看器

编辑

my plate_log表;

    public partial class plate_logs
    {
        public int Id { get; set; }
        public long Guid { get; set; }
        public string Plate { get; set; }
        public Nullable<long> DriverId { get; set; }
        public Nullable<System.DateTime> LastUpdateDate { get; set; }
        public Nullable<byte> isRemoved { get; set; }
    }

驱动程序表;

    public partial class driver
    {
        public int Id { get; set; }
        public long Guid { get; set; }
        public string Name { get; set; }
        public string Surname { get; set; }
        public string FullName { get; set; }
        public Nullable<long> CompanyId { get; set; }
        public Nullable<byte> isRemoved { get; set; }
    }

和公司表格;

    public partial class company
    {
        public short Id { get; set; }
        public long Guid { get; set; }
        public string Name { get; set; }
        public string Address { get; set; }
        public string PhoneNumber { get; set; }
        public Nullable<short> isSync { get; set; }
        public Nullable<System.DateTime> LastUpdateDate { get; set; }
        public Nullable<byte> isRemoved { get; set; }
    }

2 个答案:

答案 0 :(得分:0)

如果将{em> Eager Loading 与Include方法一起使用,那么您要实现的目标很容易实现。可以找到更多信息here

这会在幕后自动生成LINQ,从而使该表及其所请求的相关表进入任务。根据我在模型中看到的内容,我认为您还需要在表之间提供导航属性以定义它们的关系。

因此,示例如下:

模型

public class A 
{
       public int PropertyA {get; set;}

       public B B {get; set;}
}

public class B 
{
       public int PropertyB {get; set;}

       public A A {get; set;}
}

在控制器中,您现在需要像现在那样使用Include()调用LINQ方法

控制器

context_variable.A.Include(x => x.B).ToList();

我希望这对您有所帮助,并且足以说明问题。

答案 1 :(得分:0)

我找到了解决方案。 驱动程序控制器编辑;

public HttpResponseMessage Gets(DataSourceLoadOptions loadOptions)
        {
            var sorgu = (from c in db.company
                        join d in db.driver
                        on c.Guid equals d.CompanyId
                        orderby c.Guid descending
                        select new { Guid= d.Guid, Name=c.Name, });
            return Request.CreateResponse(DataSourceLoader.Load(sorgu.ToList(), loadOptions));
        }