【问题标题】:Create a class that will hold a LINQ query?创建一个包含 LINQ 查询的类?
【发布时间】:2016-06-30 15:04:39
【问题描述】:

这个问题是这个问题的延续,How to bind a variable with multiple types? LINQ

我正在尝试选择一行包含 30 列的数据,条件是列 Staff_No 中的唯一值。该行有多种数据类型。

我无法获得正确的语法,这是代码。

internal class DatabaseQueries
   {
       public static IEnumerable<int> ModValues(DatabaseDataContext database, int staffNo)
            {
                return database.Staff_Mod_TBLs
                    .Where(staff => staff.Staff_No == staffNo).Cast<int>().ToList();

            }
   }

错误是InvalidOperationException Class

这段代码给了我这个错误,

 public static IEnumerable<decimal> ModValues(DatabaseDataContext database, int staffNo)
        {
            return database.Staff_Mod_TBLs
                .Where(staff => staff.Staff_No == staffNo).Select(staff => staff.Days_No_D).ToList();
        }

错误,Severity Code Description Project File Line Suppression State Error CS0266 Cannot implicitly convert type 'System.Collections.Generic.List&lt;decimal?&gt;' to 'System.Collections.Generic.IEnumerable&lt;decimal&gt;'. An explicit conversion exists (are you missing a cast?)

【问题讨论】:

  • 你为什么要申请int?如果您只想从数据库中获取记录,为什么该方法返回一个集合?你只是在找.Single(staff =&gt; staff.Staff_No == staffNo)吗?
  • 您想要整行还是只想要int 列?你的返回类型不应该是IEnumerable&lt;Staff_Mod&gt; 什么的吗?如果您只想 one 行将resutn类型设置为类并使用SingleSingleOrDefault
  • 我试图获取具有多种数据类型的整行。
  • 那你为什么要将对象转换成整数?

标签: c# linq


【解决方案1】:

我正在尝试选择一行
[并在评论中...]
我试图获取具有多种数据类型的整行。

那么你不需要Cast()ToList()。如果你想要一条记录,只需获取那条匹配的记录:

return database.Staff_Mod_TBLs
               .Single(staff => staff.Staff_No == staffNo);

或者,如果您想返回null,而不是在没有匹配项时抛出错误:

return database.Staff_Mod_TBLs
               .SingleOrDefault(staff => staff.Staff_No == staffNo)

那么你当然需要改变方法的返回类型:

public static Staff_Mod_TBL ModValues(...)

(假设类型名基于表名,不同则根据需要替换。)

基本上,您要查找的是表示该表中记录的对象实例。不是列值的集合。

【讨论】:

  • 我正在尝试获取 30 列数据,或者这是错误的思维方式?我想将这 30 列绑定到数据网格。
  • @KyloRen:这 30 列将是正在返回的对象的 30 个属性,每个属性都以其中一列命名。
  • 好的,所以我需要在单个查询中将每一列都写到一个属性中?
  • @KyloRen:你什么意思?数据访问框架(实体框架?LINQ to SQL?其他东西?)将为您将列映射到对象。 (如果没有,请获得更好的数据访问框架。)此方法所需要做的就是返回您要查找的对象的实例。请注意,在此答案中,唯一明确引用的列是比较中使用的列。
【解决方案2】:

我认为你不能将Staff_Mod_TBLs 转换为int,这是无效的

你真的在这里混合了东西:

.Cast&lt;int&gt; 将每个元素转换为int

如果要基于过滤器返回整个对象:

public static Staff_Mod_TBLs ModValues(DatabaseDataContext database, int staffNo)
        {
            return database.Staff_Mod_TBLs
                .FirstOrDefault(staff => staff.Staff_No == staffNo);
        } 

【讨论】:

  • 这正是我一直试图开始工作的,但它给了我一个编译错误。
  • Severity Code Description Project File Line Suppression State Error CS0266 Cannot implicitly convert type 'System.Collections.Generic.List&lt;decimal?&gt;' to 'System.Collections.Generic.IEnumerable&lt;decimal&gt;'. An explicit conversion exists (are you missing a cast?) 我猜这是问题所在? public static IEnumerable&lt;decimal&gt; ModValues(DatabaseDataContext database, int staffNo)
  • @KyloRen 您能否在您的问题中发布产生此错误的查询?或者只是将返回类型更改为IEnumerable&lt;decimal?&gt;
  • @KyloRen 检查更新的答案,只需将返回类型更改为 IEnumerable&lt;decimal?&gt; 就可以了
  • 好的,这对我有用。显然这段代码行不通,.Select(staff =&gt; staff.Days_No_D &amp;&amp; staff.Day_Off).ToList();,但是如何编写代码来获取剩下的 29 列数据呢?
猜你喜欢
  • 2021-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
相关资源
最近更新 更多