[长期问题道歉,但我认为其他人回答会更清楚]
我有一个Microsoft Access数据库,它包含一个表“Customers”,其中包含以下列:
我在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
为什么会发生这种情况的任何线索?
答案 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
Select *
from Customers
where active = -1
)
失败(例如,它显示为是/否|真/假)尝试读取Active in的值并通过msgbox输出它只是为了看它真正包含的内容。