【问题标题】:c# entity framework mixing linq to objects with linq to entitiesc#实体框架将linq to objects与linq to entity混合
【发布时间】:2017-08-07 07:58:58
【问题描述】:

我有要搜索的值的数据库。

要搜索某些内容,用户需要选择特定的复选框,该复选框的值包含在内存列表中(否则复选框的任何更改值都会导致保存数据库,这是我想要避免的)。

我的数据库中的数据由

加载

.Load()

方法。

所以,我的问题是,我想知道如何构建将我的数据库值与内存真/假值混合的查询。

var query1 = from i in db.MyValuesTable
              from j in MyMemoryObjects
              where j.IsTrue && j.Id == i.Tab2Id && i.Value.Contains(_searchPhrase)
              select i;

(from i in db.TableToLoad
from j in query1
where i.CollectionWithValues.Any(x => x.Tab1Id == j.Tab1Id && x.Tab2Id == j.Tab2Id).select i).Load();

我的查询可能有点混乱,所以我将把数据库方案放在下面(EF 代码优先)

//db object
public class MyValuesTable
{
   public int Tab1Id { get; set; }
   public int Tab2Id { get; set; }
   public string Value { get; set; }
}

//memory object
public class MyMemoryObjects
{
   public int Id { get; set; }
   public bool IsTrue { get; set; }
}

//db object
public class TableToLoad
{
   public int Tab1Id { get; set; }
   public int Tab2Id { get; set; }
   public string Value { get; set; }
}

【问题讨论】:

  • 您的问题不清楚。请使其易于理解。
  • 我想进行查询,将 linq 混合到实体和 linq 到返回正确结果的对象(如果 query2 没有抛出异常消息,则应返回:“无法创建类型的常量值在此上下文中仅支持原始类型或枚举类型")

标签: c# entity-framework linq-to-entities linq-to-objects


【解决方案1】:

通常不支持将 LINQ to Entities 与 LINQ to Objects 混合使用。实际上,唯一支持的构造是应用于内存基本类型IEnumerable<T> 中的Contains 方法,它转换为SQL IN (value1, value2, ...) 子句。

幸运的是,它适用于您的场景,因为 j.IsTrue && j.Id == i.Tab2Id 条件可以转换为内存列表中的 j.Id 并应用 j.IsTrue 过滤器,然后可以在 LINQ to Entities 查询中用作 Contains 条件:

// has to be variable outside of the L2E query
var idFilter = from j in MyMemoryObjects
               where j.IsTrue
               select j.Id;

var query1 = from i in db.MyValuesTable
             where idFilter.Contains(i.Tab2Id) // <-- and use it inside
                 && i.Value.Contains(_searchPhrase)
             select i;

// ...

【讨论】:

    猜你喜欢
    • 2013-07-29
    • 2011-04-27
    • 1970-01-01
    • 2010-09-05
    • 2017-08-15
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多