在LINQ to Entities中使用未建模的对象集合

时间:2012-10-06 21:20:45

标签: c# .net entity-framework linq-to-entities

我正在使用Linq向实体和实体框架编写查询。我的应用使用两个数据库。由于客户的要求,交叉数据库不是一种选择。

让我们说MyEntity驻留在第一个数据库中(因此它在一个EF模型上)并且它引用第二个数据库SecondDBEntity中的实体(因此它在另一个EF模型上),它具有复合键。现在,假设我要检索引用一组MyEntity的所有SecondDBEntity(在我们的示例中,具有键[1,1],[1,2]和[1,3]的实体)

我想要生成的SQL是:

SELECT *
  FROM MyEntity
 WHERE (MyEntity.ForeignKeyOne = 1 AND MyEntity.ForeignKeyTwo = 1)
    OR (MyEntity.ForeignKeyOne = 1 AND MyEntity.ForeignKeyTwo = 2)
    OR (MyEntity.ForeignKeyOne = 1 AND MyEntity.ForeignKeyTwo = 3)

然后我尝试了以下代码:

var setOfEntitiesToSearch = LetsAssumeThisIsAnIEnumerableOfSecondDBEntity;
return (from myEntity in DataContext.MyEntityList
       where setOfEntitiesToSearch.Any(entityToSearch => entityToSearch.KeyOne == myEntity.ForeignKeyOne && entityToSearch.KeyTwo == myEntity.ForeignKeyTwo)
      select myEntity).ToList();

这段代码编译得很好,但是当我执行时,它给了我错误:

"Unable to create a constant value of type 'SecondDBEntity'. Only primitive types or enumeration types are supported in this context."

我的主要问题是因为实体位于不同的数据库中。我可能正在做一些愚蠢的事情,因为这是我正在尝试构建的一个非常常见的查询。所以,我相信我错过了EF中的一些功能,这将允许我创建此查询。也许是一些CompositeKey结构?或者某种方式来混合那些EF模型?

提前致谢。

2 个答案:

答案 0 :(得分:0)

首先创建两个列表

var listKeyOne = setOfEntitiesToSearch.Select(e => e.KeyOne);
var listKeyTwo = setOfEntitiesToSearch.Select(e => e.KeyTwo);

然后使用像

这样的列表
return (from myEntity in DataContext.MyEntityList
       where listKeyOne.Any(keyOne => myEntity.ForeignKeyOne == keyOne) &&
             listKeyTwo.Any(keyTwo => myEntity.ForeignKeyTwo == keyTwo)
      select myEntity).ToList();

这使问题更加微不足道。如果有效,请告诉我

答案 1 :(得分:0)

Linq无法将setOfEntitiesToSearch转换为sql查询。它只能使用原始类型。注意,IEnumerable与枚举不同。 Linq可以使用枚举,因为它可以转换为整数类型的值,但它不能将IEnumerable转换为主要类型。

从我能想到的,你可以采用这两种不同的方式。 (注意,我正在键入此代码而不进行编译,因此可能需要调试。)

1)循环通过setOfEntitiesToSearch并构建一个像这样的List:

List<MyEntity> results = new List<MyEntity>();
foreach (item in setOfEntitiesToSearch) {
    results.AddRange(
        from myEntity in DataContext.MyEntityList           
        where myEntity.ForeignKeyOne == item.KeyOne && myEntity.ForeignKeyTwo == item.KeyTwo
        select myEntity).ToList()
    );
}
return results;

2)将所有DataContext.MyEntityList获取到内存列表中并进行查询。

var entityList = DataContext.MyEntityList.ToList()
return entityList.Where(myEntity => setOfEntitiesToSearch.Any(entityToSearch => entityToSearch.KeyOne == myEntity.ForeignKeyOne && entityToSearch.KeyTwo == myEntity.ForeignKeyTwo)).ToList()

回溯到#1 - 循环调用db。

回溯到#2 - entityList可能非常大,具体取决于DataContext.MyEntityList返回的项目数。