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

C# 如何使用linq to sql c将两个不同的实体结果集分配到单个var变量中#,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我正在使用LINQtoSQL 我可以这样做吗 var lst = (somecondition) ? _db.Employees .Where(a => a.EmployeeID.Equals(employeeId)) : _db.Departments .Where(a => a.deptsID.Equal

我正在使用LINQtoSQL

我可以这样做吗

var lst = (somecondition) ? _db.Employees
                               .Where(a => a.EmployeeID.Equals(employeeId)) 
                          : _db.Departments
                               .Where(a => a.deptsID.Equals(deptId));
如果我试图这样做,那就是抛出这样一个错误

无法确定条件表达式的类型,因为存在
System.Linq.IQueryable
System.Linq.IQueryable


谁能给我提个建议吗

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

这没用,但你可以:

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

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

它们应该是相同的类型(这就是编译器抱怨的原因)。
var是一个语法上的糖类表达式,因此不必编写以下内容:

ObservableCollection<SomeLongTypeHere> myCollection = new  
    ObservableCollection<SomeLongTypeHere> (); 
编译器无法设置类型(是int还是string?),因此会抱怨

编辑:
好的,首先,我很抱歉,但是您的变量名是s**ks…
一般来说,你希望你的变量是有意义的,尤其是当你要求人们阅读这些变量并帮助你解决问题时(注意,你的问题,而不是他们的问题)…
因此,不要使用以下内容:

var query = (from a in lst ...
使用有意义的变量名,例如:

var query = (from employee in employee_list ...
现在,
lst
同样糟糕。。。有一个
employees\u list
departments\u list
(或者如果你必须:
empLst
dptLst
,但我强烈建议使用有意义的长名称。你会花更多的时间阅读而不是编写它……相信我)

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

您可以使用两个列表,然后根据您的条件使用适当的列表,或者更好的是,使用if/else来派生条件并获取数据

您不会将实体混合到一个var中,因为您不能这样使用它们。您的GUI将依赖于这些对象的属性,因此动态尝试将员工或部门列表放入常规(
var
)以处理它们是没有意义的


没有更多的细节,我无法进一步帮助你,但我的第一部分回答了你发布的问题:你不能那样做(如果你可以,你真的不应该这样做,因为这充其量只是一次黑客攻击,只会给你带来悲伤)

将部分改为:

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。

为了将两种不同的类型设置为一个变量,您需要了解如何使用多态性()

如果你考虑一下,在你分配变量之后,你会怎么处理它

假设
Employee
有方法,
Foo
,而
部门
有方法
Bar

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

是否尝试调用
instance.Foo()
?但是如果它是一个部门呢 那么
instance.Bar()
呢?但是如果它是一名
员工

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


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

您好,谢谢您的回复。var myCollection=新的可观测集合();或var myCollection=新的可观测集合();我要申报什么?这里有点混乱。两者都不是,我只是解释说,
var
可以让你的生活更轻松,打字更少。您的问题在于编译器无法提前知道将获得哪种类型。您应该将所有内容强制转换为
对象(非常难看),让这两种类型从相同的基继承(因此,使用继承,它们都是相同的基类型,并且在任何情况下都可能有效,但员工和部门似乎不相关),或者如果您只使用字符串,则使用字符串。你打算如何使用你的
lst
?var lst=_db.employees.where(a=>a.EmployeeId.Equals(EmployeeId)).asqueryable();var query=(从lst中的a将a.employeeID等于b.employeeID的_db.XTable中的b连接到xb中的xb中,从xb.DefaultIfEmpty()选择新的{//这里我将选择列});var lst=_db.departments.where(a=>a.deptsID.Equals(deptId)).asqueryable();var query=(从lst中的a将a.DeptID上的_db.XTable中的b连接到b.DeptID等于从xb.DefaultIfEmpty()中的xb中选择新的{//这里我将选择列});我在同一种方法中使用不同的情况不用担心,希望您将来考虑变量名称。这会让你和其他人的生活更轻松。如果你认为你得到了答案,别忘了将一个问题标记为已回答(我的或其他)。
var query = (from employee in employee_list ...
object lst = (somecondition) ? (object)_db.Employees.**AsEnumerable()**
                           .Where(a => a.EmployeeID.Equals(employeeId)) 
                      : _db.Departments.**AsEnumerable()**
                           .Where(a => a.deptsID.Equals(deptId));