如何解决 IQueryable Select 语句中 Union 的错误

How do I resolve an error on Union within IQueryable Select statement

我写了一个 IQueryable select 语句并尝试声明一个联合,这个联合的原因是因为我们稍后将包含一些神奇的代码,我们发现联合是最合适的方法但是我不会深入讨论,因为它与此错误无关。

Visual Studio返回的错误是

Error   6   
Cannot implicitly convert type 'System.Linq.IQueryable<AnonymousType#1>' to 
'System.Linq.IQueryable<MyProject.Models.tbl_customers>'. An  explicit conversion exists (are you missing a cast?)

select语句是:

var datacontext = db.tbl_customers.AsQueryable();

IQueryable<CustomerViewModel> thecustomer = (
               from p in datacontext
               select new {
                   customer_id = p.vessel_idx,
                   customer_name = p.customer_name                                                         
               })
               .Union (( 
                   from p in datacontext
                   select new {
                       customer_id = p.vessel_idx,
                       customer_name = p.customer_name                                                           
               }));

我尝试添加 .ToList 但这没有帮助。谁能建议解决此问题的方法?

嗯..我怀疑这与您的 LINQ 使用 Union() 这一事实无关。这是因为 LINQ returns 匿名类型,而专门用于保存结果的变量被声明为 IQueryable<CustomerViewModel> 类型。

您可以通过将 thecustomer 变量声明更改为合适的类型来轻松修复它,例如 varIQueryable<dynamic> 或其他能够容纳 IQueryable 的类型匿名类型值:

var thecustomer = (
               from p in datacontext
               select new {
                   customer_id = p.vessel_idx,
                   customer_name = p.customer_name                                                         
               })
               .Union (( 
                   from p in datacontext
                   select new {
                       customer_id = p.vessel_idx,
                       customer_name = p.customer_name                                                           
               }));

同意@har07,两个查询都使用相同的匿名类型投影结果(它们共享相同的 属性 名称和类型)。问题是 thecustomer 变量是 IQueryable<CustomerViewModel>。解决此问题的另一种方法是将您的查询投影到您的 ViewModel class:

IQueryable<CustomerViewModel> thecustomer = (
               from p in datacontext
               select new CustomerViewModel{
                   customer_id = p.vessel_idx,
                   customer_name = p.customer_name                                                         
               })
               .Union (( 
                   from p in datacontext
                   select new CustomerViewModel{
                       customer_id = p.vessel_idx,
                       customer_name = p.customer_name                                                           
               }));

在这种情况下,我假设您的视图模型 class 具有与您的匿名类型同名的属性,但您可以在方便时更改这些属性。