【问题标题】:return combined entity from join从连接返回组合实体
【发布时间】:2015-04-02 12:20:59
【问题描述】:

是否可以返回单个对象,它由使用 EF6 的两个实体之间的连接组成?

这是我的意思的一个例子,但是,我不知道要使用、选择或返回什么类型来获取组合数据集......所以我用 ???? ??在示例中。

    public static ?????? GetAppDetails(AppsLight item)
    {
        using (ApplicationEntities db = new ApplicationEntities())
        {
            ?????? retval = (from t in db.Applications
                             join g in db.Licenses on t.LicenseID equals g.LicenseID
                             where t.AppID == item.UID
                             select ????).FirstOrDefault();

            return retval;

        }
    }

【问题讨论】:

    标签: c# .net entity-framework model-view-controller


    【解决方案1】:

    您应该创建自己的返回类型。

    public class MyReturnType
    {
        public Application App { get; set; }
        public License License { get; set; }
    }
    
    
    public static MyReturnType GetAppDetails(AppsLight item)
    {
        using (ApplicationEntities db = new ApplicationEntities())
        {
            var retval = (from t in db.Applications
                             join g in db.Licenses on t.LicenseID equals g.LicenseID
                             where t.AppID == item.UID
                             select new MyReturnType
                             {
                                App = t,
                                License = l
                             }).FirstOrDefault();
            return retVal;
        }
    }
    

    如果您已正确配置外键,则不需要进行显式连接,并且可以执行类似的操作。

    public static Application GetAppDetails(AppsLight item)
    {
        using (ApplicationEntities db = new ApplicationEntities())
        {
    
            var application = (from t in db.Applications
                             where t.AppID == item.UID
                             select new MyReturnType)
                 .Include(x => x.License)
                 .FirstOrDefault();
    
            //application should have a .License property. 
            return application;
        }
    }
    

    如果您不想创建新类型,也可以使用Tuple

    public static Tuple<Application, License> GetAppDetails(AppsLight item)
    {
        using (ApplicationEntities db = new ApplicationEntities())
        {
            var tuple = (from t in db.Applications
                             join g in db.Licenses on t.LicenseID equals g.LicenseID
                             where t.AppID == item.UID
                             select Tuple.Create(t, l))
                         .FirstOrDefault();
            return tuple;
            //access the items in the tuple like this: tuple.Item1; tuple.Item2;
        }
    }
    

    【讨论】:

    • 我的问题是数据库不是我的,并且基本上在表之间创建了零关系......相反,设计师用后缀“_FK”命名字段,表示与另一张桌子......真的很伤心,但我不拥有它,所以我无法对约束或关系做任何事情。我将测试您的解决方案并尽快通知您! :)
    【解决方案2】:
      public static CombinedDto GetAppDetails(AppsLight item)
    {
        using (ApplicationEntities db = new ApplicationEntities())
        {
            CombinedDto retval = (from t in db.Applications
                             join g in db.Licenses on t.LicenseID equals g.LicenseID
                             where t.AppID == item.UID
                             select(b=>new CombinedDto { ApplicationId = t, LicenceId = item})).FirstOrDefault();
    
            return retval;
    
        }
    }
    publi class CombinedDto()
    {
      public Application Application {get;set;}
      public Licence Licence {get;set;}
    }
    

    使用 dto 或匿名对象。我认为这会更好。 谢谢。

    【讨论】:

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