Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating a LINQ select from multiple tables

Tags:

c#

linq

This query works great:

var pageObject = (from op in db.ObjectPermissions                   join pg in db.Pages on op.ObjectPermissionName equals page.PageName                   where pg.PageID == page.PageID                   select op)                  .SingleOrDefault(); 

I get a new type with my 'op' fields. Now I want to retrieve my 'pg' fields as well, but

select op, pg).SingleOrDefault(); 

doesn't work.

How can I select everything from both tables so that they appear in my new pageObject type?

like image 637
ScottG Avatar asked Aug 28 '08 14:08

ScottG


2 Answers

You can use anonymous types for this, i.e.:

var pageObject = (from op in db.ObjectPermissions                   join pg in db.Pages on op.ObjectPermissionName equals page.PageName                   where pg.PageID == page.PageID                   select new { pg, op }).SingleOrDefault(); 

This will make pageObject into an IEnumerable of an anonymous type so AFAIK you won't be able to pass it around to other methods, however if you're simply obtaining data to play with in the method you're currently in it's perfectly fine. You can also name properties in your anonymous type, i.e.:-

var pageObject = (from op in db.ObjectPermissions                   join pg in db.Pages on op.ObjectPermissionName equals page.PageName                   where pg.PageID == page.PageID                   select new                   {                       PermissionName = pg,                        ObjectPermission = op                   }).SingleOrDefault(); 

This will enable you to say:-

if (pageObject.PermissionName.FooBar == "golden goose") Application.Exit(); 

For example :-)

like image 83
ljs Avatar answered Oct 04 '22 23:10

ljs


If you don't want to use anonymous types b/c let's say you're passing the object to another method, you can use the LoadWith load option to load associated data. It requires that your tables are associated either through foreign keys or in your Linq-to-SQL dbml model.

db.DeferredLoadingEnabled = false; DataLoadOptions dlo = new DataLoadOptions(); dlo.LoadWith<ObjectPermissions>(op => op.Pages) db.LoadOptions = dlo;  var pageObject = from op in db.ObjectPermissions          select op;  // no join needed 

Then you can call

pageObject.Pages.PageID 

Depending on what your data looks like, you'd probably want to do this the other way around,

DataLoadOptions dlo = new DataLoadOptions(); dlo.LoadWith<Pages>(p => p.ObjectPermissions) db.LoadOptions = dlo;  var pageObject = from p in db.Pages                  select p;  // no join needed  var objectPermissionName = pageObject.ObjectPermissions.ObjectPermissionName; 
like image 20
Codewerks Avatar answered Oct 05 '22 01:10

Codewerks