C# 首先通过Entity Framework 6代码从数据库表中仅加载ID

C# 首先通过Entity Framework 6代码从数据库表中仅加载ID,c#,entity-framework,C#,Entity Framework,我有一个具有属性的实体用户 int Id {get; set;} 它被设置为主键 和财产 virtual List<Right> Rights {get; set;} 在我的代码中,我像往常一样从数据库中创建了一个用户,之后我只想获得权限的ID,所以我尝试这样做: myUser.Rights.Select(x=>x.Id).ToList(); 它为我提供了我想要的ID集合,但数据库的查询得到的是权限表的所有列,这是不必要的,在其他情况下,想象只为获得ID而加载大量数

我有一个具有属性的实体用户

int Id {get; set;}
它被设置为主键

和财产

   virtual List<Right> Rights {get; set;}
在我的代码中,我像往常一样从数据库中创建了一个用户,之后我只想获得权限的ID,所以我尝试这样做:

myUser.Rights.Select(x=>x.Id).ToList();
它为我提供了我想要的ID集合,但数据库的查询得到的是权限表的所有列,这是不必要的,在其他情况下,想象只为获得ID而加载大量数据可能会有很大的问题:/

查询如下所示:

> "SELECT 
>     [Extent1].[Id] AS [Id], 
>     [Extent1].[RightType] AS [RightType], 
>     [Extent1].[User_Id] AS [User_Id]
>     FROM [dbo].[Rights] AS [Extent1]
>     WHERE ([Extent1].[User_Id] IS NOT NULL) AND ([Extent1].[User_Id] = @EntityKeyValue1)"
你知道如何只加载ID吗?? 如有任何帮助,将不胜感激:


谢谢你

你可以试试这样的东西:

    var ids = _context
.Set<User>()
.Where(u.Id==id)
.SelectMany(u=>u.Rights.Select(r=>r.Id))
.ToList();
不要对EF进行尝试,但如果在此处放置一些接口、泛型和LINQ,则以下内容应该有效:

        public interface IHaveId<T>
        {
            T Id { get; set; }
        }

        public class User : IHaveId<int>
        {
            public int Id { get; set; }
            public virtual List<Right> Rights { get; set; }
        }

        public class Right : IHaveId<int>
        {
            public int Id { get; set; }

            public RightType RightType { get; set; }
        }

        public enum RightType : byte
        {
            Own,
            Copy,
            Delete
        }

        public static IEnumerable<TKey> GetChildIds<TParent,TChild,TKey>(IQueryable<TParent> src, TKey parentId, Expression<Func<TParent,IEnumerable<TChild>>> childSelector)
            where TParent : IHaveId<TKey>
            where TChild : IHaveId<TKey>
            where TKey : struct, IEquatable<TKey>

        {
            var result = src
                .Where(parent => parentId.Equals(parent.Id))
                .SelectMany(childSelector)
                .Select(child => child.Id);

            return result;
        }
//sample usage
//var ids = GetChildIds<User,Right,int>(_context.DbSet<User>(), user=>user.Rights).ToList();

不要使用实体框架——这就是它速度慢且容易出现性能问题的原因。所以你是说没有办法获得这些ID?不,我说,我认为实体框架是一个糟糕的选择,正是因为这样的问题。EF的人会争论最好的方法,我不会参与其中。你能帮我从这个查询中创建一个方法吗?这个方法可以获取用户实体的任何属性的ID,该属性将是该方法的输入参数。如果我将一个属性作为输入方法,首先加载hold属性(在本例中为Rights),然后加载id,这并不完全是我想要加载的,只有id。此方法的签名将是一个很好的起点。另外,我也不确定,但也许最好是提出新问题,以便让其他人有可能加入。感谢您的回答:不幸的是,这种构造似乎不起作用:无法将类型“Entities.Person”转换为类型“Entities”。IHaveId`1[[System.Int32,mscorlib,版本=4.0.0.0,区域性=neutral,PublicKeyToken=b77a5c561934e089]'。LINQ to Entities仅支持强制转换EDM基元或枚举类型。在用户实体中:public List getUserRightsSidsContext ctx{return GetChildIdsctx.Set,Id,x=>x.Rights.ToList;}
        public interface IHaveId<T>
        {
            T Id { get; set; }
        }

        public class User : IHaveId<int>
        {
            public int Id { get; set; }
            public virtual List<Right> Rights { get; set; }
        }

        public class Right : IHaveId<int>
        {
            public int Id { get; set; }

            public RightType RightType { get; set; }
        }

        public enum RightType : byte
        {
            Own,
            Copy,
            Delete
        }

        public static IEnumerable<TKey> GetChildIds<TParent,TChild,TKey>(IQueryable<TParent> src, TKey parentId, Expression<Func<TParent,IEnumerable<TChild>>> childSelector)
            where TParent : IHaveId<TKey>
            where TChild : IHaveId<TKey>
            where TKey : struct, IEquatable<TKey>

        {
            var result = src
                .Where(parent => parentId.Equals(parent.Id))
                .SelectMany(childSelector)
                .Select(child => child.Id);

            return result;
        }
//sample usage
//var ids = GetChildIds<User,Right,int>(_context.DbSet<User>(), user=>user.Rights).ToList();