Linq查找方法为IQueryable

时间:2015-05-26 05:21:24

标签: c# linq entity-framework iqueryable

我在我的存储库中有这个,它按预期工作:

public virtual EntityClass GetById(int id)
{
    return db.Set<EntityClass>().Find(id);
}

但是,我有一些列有太多列(例如:10列,其中我只需要3个)或一些表格,我在那里有长文本,再次,它们不需要被提取。

我在想是否仍然可以通过主键进行搜索但是可能获得IQueryable结果?或者至少可以让我做这样的事情:

var blah = myRepo.GetById(myId).Select(s => new {column 2, column 3, column 7})

3 个答案:

答案 0 :(得分:1)

我会创建另一个包含所需属性子集的类。这样就应该总是清楚你在做什么:

public class EntityClassLite
{
   public int Id {get; set;}
   public string Column2 {get; set;}
   public string Column3 {get; set;}
   public string Column7 {get; set;}
}

然后您可以在存储库中使用单独的方法:

public EntityClassLite GetLiteById(int id)
{
    return db.Set<EntityClass>()
             .All
             .Where(e => e.Id = id)
             .Select( new EntityClassLite
                    {
                       Column2 = e.Column2
                       Column3 = e.Column3
                       Column7 = e.Column7
                    }
             .FirstOrDefault()
}

你也可以考虑使用继承:

public class EntityClass: EntityClassLite
{
   public string Column1 {get; set;}
   public string Column4 {get; set;}
   public string Column5 {get; set;}
   public string Column6 {get; set;}
   public string Column8 {get; set;}
   public string Column9 {get; set;}
   public string Column10 {get; set;}
}

然后你会有两个存储库。一个用于EntityClass,一个用于EntityClassLite,每个都有自己的Find方法,每个方法都返回您需要的数据。

顺便说一句,我发现很难想象一个具有如此大的列的实体可以获取它的单一实例会导致严重的性能问题。

答案 1 :(得分:1)

好吧,我认为您应该重新考虑使用存储库(如果您使用的是 EF )并将您的提取逻辑移动到GetEmployeeById(int id)等特定方法中em>服务层。

以下是关于如果您将存储库与实体框架一起使用会发生什么的引用。

  

您已放弃数据存储技术的所有功能,以便以无聊,绝对,低效的方式访问您的数据。 - Khalid Abuhakmeh

答案 2 :(得分:0)

var blah = myRepo.Where(s => s.Id == myId).Select(s => new {column 2, column 3, column 7}).FirstOrDefault();

如果您打算在您可以执行的选择中包含Id:

var blah = myRepo.Select(s => new {column 2, column 3, column 7}).FirstOrDefault(s => s.Id == myId);