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();