Microsoft Access中的布尔列,使用linq过滤数据

时间:2009-03-07 11:07:49

标签: c# linq ms-access filter ms-access-2007

[长期问题道歉,但我认为其他人回答会更清楚]

我有一个Microsoft Access数据库,它包含一个表“Customers”,其中包含以下列:

  • ID(自动编号)
  • 姓名(文字)
  • 有效(是/否)

我在C#中创建了数据库表类,如下所示:

[Table (Name = "Products")]
public class Product
{
    [Column (IsPrimaryKey = true, Name = "ProductID")]
    public int ID;

    [Column (Name = "ProductName")]
    public string Name;

    [Column (Name = "Active")]
    public bool Active;
}

我正在使用以下代码段来获取活跃的产品:

using (var con = new OleDbConnection 
      (@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\LearnLinq.accdb")) {
    var db = new DataContext (con);
    var productTable = db.GetTable<Product> ();
    var allProducts = from p in productTable
                      where p.Active
                      select p;

    foreach (var p in allProducts) {
        AddLine ("ID: " + p.ID.ToString () +
            ", Name: " + p.Name +
            ", Active: " + p.Active.ToString ());
    }
}

问题是上面的查询导致“无记录”。我试图分析生成的SQL,它说如下:

SELECT [t0].[ProductID] AS [ID], [t0].[ProductName] AS [Name], [t0].[Active]
FROM [Products] AS [t0]
WHERE [t0].[Active] = 1

为什么会发生这种情况的任何线索?

3 个答案:

答案 0 :(得分:2)

尝试将OleDbCommand对象与生成的SQL一起使用,并迭代使用OleDbDataReader返回的内容。

然后尝试使用此SQL字符串

SELECT [t0].[ProductID] AS [ID], [t0].[ProductName] AS [Name], [t0].[Active] 
FROM 
[Products] AS [t0] 
WHERE [t0].[Active] = YES

我认为它可能与Jet数据库中Yes / No数据类型使用的基础值有关。

  

是/否

     

逻辑字段可以   显示为是/否,是/否,或   开关。在代码中,使用常量   真和假,相当于-1和0   分别

查看开发者社区下的BLS site - Linq to Access解决方案的源代码

答案 1 :(得分:0)

正如Russ所说,它看起来像布尔人的不同表现形式的问题。

尝试将“Where p.active”更改为“Where p.active&lt;&gt; 0”

答案 2 :(得分:0)

查看productTable.active字段包含Access数据库的内容, 我打赌它可能不是0或1.它可能是-1。

你可能想要的是这样的:

var allProducts = from p in productTable
                  where p.Active = -1
                  select p;

更新:

O.P.告诉我这在linq / C#中不起作用;但必须有一种方法可以在linq

中执行以下SQL的等效操作
Select * 
from Customers
where active = -1

失败(例如,它显示为是/否|真/假)尝试读取Active in的值并通过msgbox输出它只是为了看它真正包含的内容。