I am trying to write a LINQ
query that will render that following SQL
. I am close but it still isn't correct.
Desired SQL
SELECT
TableDisplayColumns.Id
, TableDisplayColumns.ViewName
, TableDisplayColumns.ColumnName
, TableDisplayColumns.ControllerName
, TableDisplayColumns.TableDisplayName
, TableDisplayColumns.IsVisibleByDefault
FROM dbo.TableDisplayColumns
LEFT JOIN dbo.UserTableDisplayColumns ON UserTableDisplayColumns.TableDisplayColumnId = TableDisplayColumns.Id
WHERE
(
(TableDisplayColumns.IsVisibleByDefault = 1 AND UserTableDisplayColumns.IsNotVisible IS NULL)
OR UserTableDisplayColumns.IsNotVisible = 0
)
AND (TableDisplayColumns.ControllerName = 'Contacts' AND TableDisplayColumns.ViewName = 'Index')
Current SQL
DECLARE @p0 NVarChar(1000) = 'Index'
DECLARE @p1 NVarChar(1000) = 'Contacts'
-- EndRegion
SELECT [t0].[Id], [t0].[ColumnName], [t0].[IsVisibleByDefault], [t0].[TableDisplayName], [t0].[ViewName]
FROM [TableDisplayColumns] AS [t0]
LEFT OUTER JOIN ([UserTableDisplayColumns] AS [t1]
LEFT OUTER JOIN [TableDisplayColumns] AS [t2] ON [t2].[Id] = [t1].[TableDisplayColumnId]) ON [t0].[Id] = [t1].[TableDisplayColumnId]
WHERE ([t0].[ViewName] = @p0) AND ([t0].[ControllerName] = @p1) AND ([t0].[IsVisibleByDefault] = 1) AND ([t2].[IsVisibleByDefault] = 1)
Entities
public class UserTableDisplayColumn
{
public int Id { get; set; }
public int TableDisplayColumnId { get; set; }
public bool IsNotVisible { get; set; }
public virtual TableDisplayColumn TableDisplayColumn { get; set; }
}
public class TableDisplayColumn
{
public int Id { get; set; }
[StringLength(50), Required]
public string ViewName { get; set; }
[StringLength(50), Required]
public string ColumnName { get; set; }
[StringLength(50), Required]
public string ControllerName { get; set; }
[StringLength(50), Required]
public string TableDisplayName { get; set; }
[Required]
public bool IsVisibleByDefault { get; set; }
}
Finally the current query:
var query =
(
from column in Context.TableDisplayColumns
.Where(x=>x.IsVisibleByDefault)
.Where(x=>x.ControllerName == "Contacts")
.Where(x=>x.ViewName == "Index")
join userColumn in Context.UserTableDisplayColumns on column.Id equals userColumn.TableDisplayColumnId into userColumnColumns
from userColumnColumn in userColumnColumns.DefaultIfEmpty()
select new TableDisplayColumn()
{
Id = column.Id,
ColumnName = column.ColumnName,
ControllerName = column.ColumnName,
IsVisibleByDefault = column.IsVisibleByDefault,
TableDisplayName = column.TableDisplayName,
ViewName = column.ViewName
}
).ToList();
What I am trying to accomplish get the default column if there isn't anything in the UsersColumns
Table. If there is a record in the UsersColumns
then I want to only return if IsNotVisible
= false.