我正在使用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>
任何人都可以向我提出建议。
答案 0 :(得分:1)
如果这两个实体不共享公共基类或通用接口,则不能。从技术上讲,你可以把它们都放在一个对象列表中,但这不是你想要的。想想这个程序,你怎么知道这个列表是否包含员工或部门,如果他们没有任何共同点,你会怎么做呢。
答案 1 :(得分: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_list
或departments_list
(或者你必须:empLst
或dptLst
,但是我强烈建议使用有意义的长名称。你会花更多的时间阅读它而不是写它...相信我这个。)
话虽如此,您的lst
基本上是员工ID与我假设的变量相同的所有条目。
您可以使用2个列表,然后根据您的条件使用正确的列表,或者更好的是,使用if / else分配条件并获取数据。
您不会将实体混合到var中,因为您无法以这种方式真正使用它们。您的GUI将取决于这些对象的属性,因此动态尝试将员工或部门列表添加到常规(var
)以便处理它们是没有意义的。
没有更多细节,我无法进一步帮助,但我的第一部分回答了你发布的问题:你不能这样做(如果可以的话,你真的不应该这样做,因为它会在最好的情况下成为一个黑客,只是在路上造成悲伤)
答案 2 :(得分:0)
这没用,但你可以:
object lst = (somecondition) ? (object)_db.Employees
.Where(a => a.EmployeeID.Equals(employeeId))
: _db.Departments
.Where(a => a.deptsID.Equals(deptId));
两个列表都会将自己投射到对象上。你将无法对该变量做任何事情,但它有效。
答案 3 :(得分: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 - 因为不是每个LINQ都可以转换为标准SQL。
答案 4 :(得分:0)
为了将两种不同类型设置为单个变量,您需要了解如何使用多态(you can read about it in Wikipedia)。
如果您考虑一下,在分配变量后,您会用它做什么?
假设Employee
有方法,Foo
而Department
有方法Bar
。
您将如何处理查询返回的对象?
您是否会尝试拨打instance.Foo()
?但如果它是Department
怎么办?
那么instance.Bar()
怎么样?但如果是Employee
怎么办?
您需要调用您(和编译器)知道两个类中都存在的方法 这就是多态性开始的地方 您需要能够以相同的方式引用它们,即通过它们的公共基类或它们都实现的接口。
当然,在.Net中,所有对象都派生自object
类,因此您始终可以将它们输入到对象列表中,而不是检查结果。但恕我直言,这不是一个非常优雅的解决方案。