【发布时间】:2016-06-02 12:37:23
【问题描述】:
我需要从不同的数据库中获取数据,然后将这两个数据集组合成一个 IQueryable 集合。
数据库#1 数据示例:
-- SOLUTION #1
[ID] [int],
[Name] [nvachar](50),
[ExpirationDate] [datetime],
[Users] [int]
Databse #2 数据示例:
-- SOLUTOIN #1
[ID] [int],
[Name] [nvarchar](50),
[Users] [int]
如您所见,数据库#2 中的解决方案没有ExpirationDate 属性,这给我在执行Union() 时带来了一些问题。
我尝试了以下方法:
public static IQueryable GetAll()
{
var list = (from solution1 in db1.Solutions
select new
{
Id = solution1.ID,
Name = solution1.Name,
ExpirationDate = solution1.ExpirationDate,
Users = solution1.Users
})
.Union(from solution2 in db2.Solutions
select new{
Id = solution2.ID,
Name = solution2.Name,
ExpirationDate = (DateTime?) null,
Users = solution2.Users
});
}
但不幸的是,这不起作用。调用它时,我得到以下异常:
对象引用未设置为对象的实例。
我想这是因为我设置了ExpirationDate = (DateTime?) null。
我也尝试过从 SQL 视图中获取数据,就像这样(这是db2 的示例,因为db1 有点不言自明)
CREATE VIEW [dbo].[v_Solutions]
AS SELECT s.ID,
s.Name,
null AS [ExpirationDate],
s.Users
FROM Solution
然后将 LINQ select new 语句更改为以下内容:
.Union(from solution2 in db2.Solutions
select new{
Id = solution2.ID,
Name = solution2.Name,
ExpirationDate = (DateTime?) solution2.ExpirationDate,
Users = solution2.Users
});
但是这样做会给我一个编译错误:
无法转换类型“int?”到“System.DateTime?”
虽然solution2.ExpirationDate 中的数据应该只是null。
我不太确定如何完成此声明。有什么想法吗?
【问题讨论】:
-
如果您使用 EF 对两个数据库进行查询,我会假设您需要在内存中进行联合。所以在
Union之前打一个AsEnumerable并在Union内的查询末尾打另一个。 -
确保
solution1或solution2本身不为空......例如以这种方式跳过它们(from solution1 in db1.Solutions where (solution1 != null) select new ..... -
只是做
null AS [ExpirationDate]可能无法推断出正确的类型,因此 CAST 或 CONVERT null as datetime 可能会起作用(在视图内)? -
@M.kazemAkhgary 我的
solution1实际上是null。我想知道为什么,但至少我发现了这个问题。 -
如果你的集合中有 null 是预期的,那么不用担心你可以用
where省略它们。但是,如果您的集合中预计不会有空项目,请不要用where省略它们。尝试找出导致空元素的主要问题...
标签: c# sql-server linq