如何使用linq to sql c将两个不同的实体结果集分配到单个var变量中#

时间:2013-10-29 06:25:20

标签: c# linq linq-to-sql

我正在使用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>

任何人都可以向我提出建议。

5 个答案:

答案 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_listdepartments_list(或者你必须:empLstdptLst,但是我强烈建议使用有意义的长名称。你会花更多的时间阅读它而不是写它...相信我这个。)

话虽如此,您的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有方法,FooDepartment有方法Bar

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

您是否会尝试拨打instance.Foo()?但如果它是Department怎么办? 那么instance.Bar()怎么样?但如果是Employee怎么办?

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

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