2014-09-25 109 views
0

我已經研究了這個,並且如果這是重複的道歉,但我似乎找不到正確的答案,並且我從這個網站學到了很多東西。左外連接Linq到MVC模型的實體

我有3個表:

CREATE TABLE [Reporting].[ReportingCompanies](
[ID] [int] IDENTITY(1,1) NOT NULL, 
[EINC] [int] NOT NULL, 
[CompanyId] [varchar](4) NOT NULL, 
[CompanyName] [varchar](50) NOT NULL, 
[LastClosedWeek] [datetime] NOT NULL, 
[PriorWeekSales] [decimal](14, 4) NULL, 
[PriorWeek] [datetime] NULL, 
[CurrentWeek] [datetime] NULL, 
[LastWeekSales] [decimal](14, 4) NULL, 
[AgingBalance] [decimal](14, 4) NULL, 
[DataAsOf] [datetime] NULL, 
[Tier] [int] NULL, 
[CurrentWeeklyAverage] [decimal](14, 4) NULL, 
[AvgAged] [decimal](14, 4) NULL, 
[hasSpread] [bit] NULL, 
[DSO] [int] NULL, 
[isFamily] [bit] NULL, 
[ImportStatus] [bit] NULL, 
[ClientStatus] [varchar](50) NULL, 
CONSTRAINT [PK_ReportingCompanies] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,  ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

CREATE TABLE [Reporting].[AllowedCompanies](
[ID] [int] IDENTITY(1,1) NOT NULL, 
[CustomUserProfileUserId] [uniqueidentifier] NOT NULL, 
[CustomUserProfileID] [int] NOT NULL, 
[ReportingCompanyID] [int] NOT NULL, 
CONSTRAINT [PK_AllowedCompanies] PRIMARY KEY CLUSTERED 
(
[ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

CREATE TABLE [Reporting].[CustomUserProfiles](
[ID] [int] IDENTITY(1,1) NOT NULL, 
[ApplicationId] [uniqueidentifier] NOT NULL, 
[UserId] [uniqueidentifier] NOT NULL, 
[UserName] [nvarchar](256) NOT NULL, 
[LoweredUserName] [nvarchar](256) NOT NULL, 
[MobileAlias] [nvarchar](16) NULL, 
[IsAnonymous] [bit] NOT NULL, 
[LastActivityDate] [datetime] NOT NULL, 
[ImportStatus] [bit] NULL, 
CONSTRAINT [PK_CustomUserProfiles] PRIMARY KEY CLUSTERED 
(
[UserId] ASC, 
[ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

我現在需要使用一個左外連接添加第四臺,到如果不存在任何記錄只能得到一個默認值0的VisitCount列。

CREATE TABLE [PayJot].[FavoriteClients](
[FavRowID] [int] IDENTITY(1,1) NOT NULL, 
[Userid] [uniqueidentifier] NOT NULL, 
[CompanyId] [int] NOT NULL, 
[VisitCount] [int] NOT NULL, 
CONSTRAINT [PK_FavoriteClients] PRIMARY KEY CLUSTERED 
(
    [FavRowID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

這裏是一個返回錯誤我的最新嘗試「實體或複雜類型‘DALModel.FavoriteClient’不能在LINQ到實體查詢構建」但是這正是智能感知似乎要求(?)

  var userName = HttpContext.Current.User.Identity.Name; 

     var q = from c in db.ReportingCompanies1 
       join a in db.AllowedCompanies on new { ID = (int)c.ID } equals new { ID = a.ReportingCompanyID } 
       join p in db.CustomUserProfiles on new { CustomUserProfileID = a.CustomUserProfileID } equals new { CustomUserProfileID = p.ID } 

       join f in db.FavoriteClients on new { A = c.ID, B = p.UserId } equals new { A = f.CompanyId, B = f.Userid } into fvc 
       from userfavs in fvc.DefaultIfEmpty(new FavoriteClient { CompanyId = c.ID, Userid = p.UserId , VisitCount = 0 }) 

       where 
        p.UserName == userName 
       orderby c.CompanyName 
       select new Clients() 
       { 
        ID = c.ID, 
        CompanyId = c.CompanyId, 
        CompanyName = c.CompanyName, 
        visitCount = userfavs.VisitCount 
       }; 

      ObservableCollection<Clients> clientList = new ObservableCollection<Clients>(q.ToList()); 

我是相當新的LINQ的,雖然我已閱讀意義的解釋了所有的例子,他們在執行能力嚴重不足。請提前告知您是否可以和thanx。

+0

此:'{ID =(int)的c.ID}等於新{ID = a.ReportingCompanyID}'可以簡化爲這樣:'c.ID等於a.ReportingCompanyId'您只在加入多列時才使用新功能。 – paqogomez 2014-09-25 19:38:46

+0

您是否嘗試過刪除'DefaultIfEmpty'參數?它不是一個正常的左連接。我沒有跟隨你想要做的事情。 – paqogomez 2014-09-25 20:06:52

+0

我的理解是DefaultIfEmpty是我可以得到0而不是NULL的地方,但我不得不承認我只是想了解其他的例子。 – Darkloki 2014-09-25 20:20:19

回答

1

我剛得到它的工作:

 var q = from p in db.CustomUserProfiles 
       join a in db.AllowedCompanies on new { ID = p.ID } equals new { ID = a.CustomUserProfileID } 
       join c in db.ReportingCompanies1 on new { ReportingCompanyID = (int)(int)a.ReportingCompanyID } equals new { ReportingCompanyID = c.ID } 
       join f in db.FavoriteClients 
         on new { a.CustomUserProfileUserId, ReportingCompanyID = a.ReportingCompanyID } 
       equals new { CustomUserProfileUserId = (Guid)f.Userid, ReportingCompanyID = f.CompanyId } into FavoriteClients_join 
       from FavoriteClients in FavoriteClients_join.DefaultIfEmpty() 
       where 
        p.UserName == userName 
       orderby 
        FavoriteClients.VisitCount descending, 
        c.CompanyName 
       select new Clients() 
       { 
        ID = c.ID, 
        CompanyId = c.CompanyId, 
        CompanyName = c.CompanyName, 
        visitCount = ((Int32?)FavoriteClients.VisitCount ?? (Int32)0) 
       }; 
+0

出色的工作。我仍然建議修剪這些連接。使他們難以閱讀。 – paqogomez 2014-09-25 20:41:21