Converting a LEFT OUTER JOIN to Entity Framework

前端 未结 3 2035
野性不改
野性不改 2020-12-05 14:55

Here is a SQL Query I want to convert to EF4.3

        command = database.GetSqlStringCommand(@\"
                                select 
                            


        
相关标签:
3条回答
  • 2020-12-05 15:02

    Given the foreign keys that exist in the question diagram, how about something like this?

    var query = from a in context.Authentications
                select new
                {
                    a.AuthenticationID,
                    a.Username,
                    a.Authorisations.Permissions ?? false,
                    a.Authorisations.Organisations.OrganisationIdentifier ?? 0
                    a.Authorisations.Organisations.OrganisationID ?? 0
                };
    
    0 讨论(0)
  • 2020-12-05 15:14

    I went ahead and moved the entire query to a Stored Procedure on the database. This solves the problem by avoiding LINQ and ObjectBuilder in the first place.

    0 讨论(0)
  • 2020-12-05 15:25

    The basic syntax for a "left join" in Linq is like this:

    from x in table1
    join y in table2 on x.id equals y.id into jointable
    from z in jointable.DefaultIfEmpty()
    select new
    {
      x.Field1, 
      x.Field2,
      x.Field3,
      Field4 = z == null ? 0 : z.Field4
    };
    

    In your case, I'm a little confused because the entity relations you seem to be using in your Linq don't match the ones implied by your SQL; are the relationships here zero-or-one, zero-or-many, one-to-one, etc? Specifically, you're doing this:

    from h in context.Authentications
    join t in context.Authorizations on h.AuthenticationId equals t.Authentications.AuthenticationId
    

    but your SQL implies that "Authentication" is the parent here with zero-or-more "Authorization" children, not the other way around, which would be more like:

    from h in context.Authentications
    from t in h.Authorizations.DefaultIfEmpty()
    

    If you can give us a better idea of the data model and what data you expect to get out of it we can more easily explain how that query would look in Linq. Assuming that your relationships match what is implied by the SQL, you should be able to get what you want using the following Linq queries:

    var query = from h in context.Authentications
                from t in h.Authorizations.DefaultIfEmpty()
                select new
                {
                    h.AuthenticationId,
                    h.Username,
                    Permissions = t == null ? null : t.Permissions,
                    Organizations = t == null ? new EntitySet<Organization>() : t.Organizations
                };
    
    var query2 = from x in query
                 from o in x.organizations.DefaultIfEmpty()
                 select new
                 {
                     AUTHENTICATION_ID = (short?)x.AuthenticationId,
                     x.Username,
                     x.Permissions,
                     OrganizationIdentifier = o == null ? null : o.OrganizationIdentifier,
                     OrganizationID = o == null ? (short?)null : o.OrganizationID 
                 };
    
    0 讨论(0)
提交回复
热议问题