【问题标题】:C# Linq-to-SQL multiple columnsC# Linq-to-SQL 多列
【发布时间】:2019-05-19 14:49:42
【问题描述】:

我目前正在尝试使用 Linq-to-SQL 在 C# 中选择多个列。当像this one 一样查看其他线程时,这是一件非常简单的事情,所以我尝试了:

var users = context.GetTable<DbHelper.User>();

var query = from u in users
            where u.Email == TbUsername.Text
            select new { u.Active, u.Password };

if(!query.Any())
{
  MessageBox.Show("Could not find an account with that Email");
  return;
}

var result = query.First();   // Error occurs here

DbHelper中的用户表:

[Table(Name="Users")]
public class User 
{
    [Column(IsPrimaryKey = true, AutoSync = AutoSync.OnInsert, IsDbGenerated = true)]
    public int Id { get; set; }

    [Column]
    public int RoleID { get; set; }

    [Column]
    public string Email { get; set; }

    [Column]
    public string Password { get; set; }

    [Column]
    public string Firstname { get; set; }

    [Column]
    public string Lastname { get; set; }

    [Column]
    public int OfficeID { get; set; }

    [Column]
    public string Birthdate { get; set; }

    [Column]
    public int Active { get; set; }
}

该表在 SQL Server 中如下所示:

[ID]        INT           IDENTITY (1, 1) NOT NULL,
[RoleID]    INT           NOT NULL,
[Email]     NVARCHAR(150) NOT NULL,
[Password]  NVARCHAR(50)  NOT NULL,
[FirstName] NVARCHAR(50)  NULL,
[LastName]  NVARCHAR(50)  NOT NULL,
[OfficeID]  INT           NULL,
[Birthdate] DATE          NULL,
[Active]    BIT           NULL,

这会导致错误

System.InvalidCastException:转换无效

我的代码有什么问题?这真的很令人困惑,因为它似乎对其他人有用。如果您需要更多代码,请告诉我

【问题讨论】:

  • 你的类数据类型映射到正确的对应sql类型了吗?
  • 是的,除了 Birthdate 之外,因为那是我相信 C# 中不存在的 Date。如果有帮助,我可以将数据库结构添加到线程中......?
  • 您是否分析了实际的 sql 查询?它返回什么?
  • 如果我理解正确,它返回 int: Active and string: Password BUT as Anonymours Types
  • OT .Any() 和 .First() 都会导致数据库查询。您可能需要一个 .ToList() 首先并检查结果

标签: c# linq linq-to-sql


【解决方案1】:

由于数据库表中活动列的类型是“位”,EF 需要一个“布尔”类型的属性。 0==false,1==true,如您所料。

【讨论】:

  • 就是这样。您的数据类与基础值不匹配。
【解决方案2】:

尝试使用.FirstOrDefault()

var result = query.FirstOrDefault();

如果result 在此调用后为空,则您的选择没有从数据库表中返回任何行。

【讨论】:

  • 还是同样的错误:无效的转换异常。我也在检查查询是否找到任何结果,我可能应该将其添加到线程中
  • First() 在这种情况下抛出 ArgumentNullException,而不是 InvalidCastException
  • @BenjaminFrost 而不是完全正确地检查 var result = query。 FirstOrDefault() ;然后去检查它是否为空。
  • @DSPassionate 使用 query.Any() 函数检查更新的 Thread Iam 检查
猜你喜欢
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多