0

我正在使用 linq to sql。

我可以这样做吗?

var lst = (somecondition) ? _db.Employees
                               .Where(a => a.EmployeeID.Equals(employeeId)) 
                          : _db.Departments
                               .Where(a => a.deptsID.Equals(deptId));

如果我试图这样做,它会抛出这样的错误

无法确定条件表达式的类型,因为System.Linq.IQueryable<Employee>和 之间没有隐式转换System.Linq.IQueryable<Department>

任何人都可以给我建议。

4

5 回答 5

1

它们应该是相同的类型(这就是编译器抱怨的原因)。
var 是一个语法糖表达式,所以不要写这样的东西:

ObservableCollection<SomeLongTypeHere> myCollection = new  
    ObservableCollection<SomeLongTypeHere> (); 

你可以写

var myCollection = new  
    ObservableCollection<SomeLongTypeHere> (); 

编译器会知道它var代表ObservableCollection<SomeLongTypeHere>

您尝试做的就是这样做:

var someVar = (condition) ? (int) 5 : (string) "some string";

编译器无法设置类型(它是 int 吗?它是字符串吗?),因此会抱怨。

编辑:
好的,首先,我很抱歉,但是你的变量名 s**ks ...
作为一般规则,你希望你的变量有意义,特别是如果你要求人们阅读它们并帮助你解决你的问题(注意,你的问题,而不是他们的问题)......
所以,不要使用类似的东西:

var query = (from a in lst ...

使用有意义且有意义的变量名,例如:

var query = (from employee in employee_list ...

现在,lst同样糟糕......有一个employees_listor departments_list(或者如果你必须:empLstor dptLst,但我强烈建议使用有意义的长名称。你会花更多的时间阅读它而不是写它......相信我) .

话虽如此,您lst基本上是所有员工 ID 与我假设的变量相同的条目。

您可以使用 2 个列表,然后根据您的条件使用正确的列表,或者更好的是,使用 if/else 分叉条件并获取数据。

您不会将实体混合到 var 中,因为您不能真正以这种方式使用它们。您的 GUI 将取决于这些对象的属性,因此动态尝试将员工或部门列表放入一般 ( var) 中以处理它们是没有意义的。

没有更多细节,我无法提供更多帮助,但我的第一部分回答了你发布的问题:你不能那样做(如果可以,你真的不应该这样做,因为这将是一个黑客充其量只是在路上造成悲伤)

于 2013-10-29T06:52:47.797 回答
1

如果这两个实体不共享公共基类或公共接口,则不能。从技术上讲,您可以将它们都放入对象列表中,但这不是您想要的。想想这个项目,你怎么知道列表中是否包含员工或部门,如果他们没有共同点,你会怎么处理。

于 2013-10-29T06:43:57.553 回答
0

这是没用的,但你可以:

object lst = (somecondition) ? (object)_db.Employees
                           .Where(a => a.EmployeeID.Equals(employeeId)) 
                      : _db.Departments
                           .Where(a => a.deptsID.Equals(deptId));

两个列表都会将自己转换为对象。您将无法对该变量执行任何操作,但它可以工作。

于 2013-10-29T06:45:08.757 回答
0

将部分更改为:

object lst = (somecondition) ? (object)_db.Employees.**AsEnumerable()**
                           .Where(a => a.EmployeeID.Equals(employeeId)) 
                      : _db.Departments.**AsEnumerable()**
                           .Where(a => a.deptsID.Equals(deptId));

请注意,这将更改为“IEnumerable”。LINQ-TO-OBJECT——<strong>因为不是每个 LINQ 都可以转换为标准 SQL。

于 2013-10-29T06:56:37.360 回答
0

为了将两种不同的类型设置为单个变量,您需要了解如何使用多态性(您可以在 Wikipedia 中阅读有关它的信息)。

如果您考虑一下,在分配变量后,您会如何处理它?

让我们假设Employee有方法,FooDepartment有方法Bar

您将如何处理从查询返回的对象?

你会尝试打电话instance.Foo()吗?但如果它是一个Department
那么怎么样instance.Bar()?但如果它是一个Employee

您需要调用一个您(和编译器)都知道在两个类中都存在的方法。
这就是多态性发挥作用的地方。
您需要能够以相同的方式引用两者,即通过它们的公共基类或它们都实现的接口。

当然,在 .Net 中,所有对象都派生自object该类,因此您始终可以将它们输入到对象列表中,然后检查结果。但恕我直言,这不是一个非常优雅的解决方案。

于 2013-10-29T06:58:00.207 回答