【问题标题】:IQueryable dynamic set propertyIQueryable 动态集属性
【发布时间】:2020-09-17 23:24:32
【问题描述】:

谁从连接表达式中设置属性

public interface IHiddenEntity
{
  bool Hidden { get; set;}
}
public interface IEntity 
{
   long Id { get; set;}
   string Name { get; set;}
}

public class Entity: IEntity, IHiddenEntity 
{
   public long Id { get; set;}
   public string Name { get; set;}
   public bool Hidden { get; set;}
}

public class Hidden 
{
   public string TableName {g et; set; }
   public long RecordId { get; set; }
}

public class Person: Entity{ ... }


public IQueryable<T> All(bool loadHidden = false)
  where T : class, IEntity, IHiddenEntity 
{
    string tableName = "<T> name";
    return from x in Context.Set<T>()
           join h in Context.Set<Hidden>().Where(record => record.TableName == tableName) on x.Id equals h.RecordId into hr
            from h_r in hr.DefaultIfEmpty()
            where loadHidden ? true : h_r == null
            select x;
}

但我不明白如何设置 隐藏字段中的值。

  1. 只需要返回 IQueryable,因为还有 方法执行的条件。
  2. 也不可能 转换为 IEnumerable:这不是最终值(见上文)。

UDP: 没有考虑为每个模型创建选择的选项 - 许多模型具有大量字段!

【问题讨论】:

  • 你为什么有这个Hidden实体/表?设置这些实体的过程也可以直接在适当的实体中设置Hidden 属性。

标签: entity-framework linq-to-entities iqueryable


【解决方案1】:

所以,找到了一个主意。 创建具有所需属性的包装对象,并在执行查询后转换为实体类型。

internal EntityWrapper<T>
{
      public T Model { get; set; }
      public bool Hidden { get; set; }
}
public IQueryable<T> All(bool loadHidden = false)
  where T : class, IEntity, IHiddenEntity 
{
    string tableName = "<T> name";
    var query = from x in Context.Set<T>()
           join h in Context.Set<Hidden>().Where(record => record.TableName == tableName) on x.Id equals h.RecordId into hr
            from h_r in hr.DefaultIfEmpty()
            select new EntityWrapper<T>(){ Model = x, Hidden = h_r != null};

    if(!loadHidden)
        query = query.Where(x => !x.Hidden);
}

并在构建 sql 查询和结果后使用包装的对象进行转换。

    Expression<System.Func<EntityWrapper<T>,T> castFunc = x => x.Select(wr => {wr.Model.Hidden = wr.Hidden; return wr.Model;});

仅投射 IEnumerable&lt;EntityWrapper&lt;T&gt;&gt; 对象。


var result = castFunc(<query>.ToList());

【讨论】:

    猜你喜欢
    • 2011-02-15
    • 2015-03-21
    • 2012-06-24
    • 2017-05-23
    • 2011-11-16
    • 1970-01-01
    • 2018-02-03
    • 2010-11-14
    • 1970-01-01
    相关资源
    最近更新 更多