简体   繁体   中英

Linq to entities join not working

Any idea why the following code will not compile?

IEnumerable users;
using (var ent = new GatekeeperEntities())
{
    users = from t1 in ent.Users
            join t2 in ent.UserStatus1 on t1.ID equals t2.UserId
            where t2.ExpirationDateTime != null
            select new {t1.ID, t1.Name, t1.UserName, t2.Status };
    }

foreach (var user in users)
{
    user.ID; // Cannot resolve symbol ID
}

Restructure your code as below.

using (var ent = new GatekeeperEntities())
{
    var users = from t1 in ent.Users
        join t2 in ent.UserStatus1 on t1.ID equals t2.UserId
        where t2.ExpirationDateTime != null
        select new {t1.ID, t1.Name, t1.UserName, t2.Status };

    foreach (var user in users)
    {
        user.ID;
    }
}

The contents of an IEnumerable are of type System.Object, you need to use the var keyword instead so that the compiler will infer that users is of type IEnumerable<T> for some anonymous type T. If you want to use an anonymous type, loop over the elements inside the scope of the using block.

  user.Id; <-----Cannot resolve symbol ID

According to your code it should be user.ID (upper case not lower case) - capitalization matters.

Also you have user declared as IEnumerable - so you won't get any properties of the type it really is, just the properties available on IEnumerable - declare it as var and use it inside the using statement, or create a class instead of using an anonymous type.

Try to cast your user object within the loop.

foreach (var user in users)   
{
    ((User)user).ID;
}

And remember: what you usually accomplish with joins in SQL, can be simply done by moving along relations in EF:

users = from t2 in ent.UserStatus.Include("User") 
where t2.ExpirationDateTime != null
select t2

This gives you the UserStatus es you want, and you can access the User of each UserStatus through the property User that is propabely defined in your model.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM