【发布时间】:2009-07-18 04:14:54
【问题描述】:
我在 linq to sql 中遇到了一个有趣的错误。看看下面的代码,它是从我正在编写的搜索引擎的 LINQtoSQL 查询中粗略翻译而来的。
查询的目标是查找 ID 依次为“Joe”、“Jeff”、“Jim”的任何组。
请注意名为 localKeyword 和 localInt 的变量。如果您要删除这些看似无用的局部变量的声明,并将它们替换为它们正在代理的变量,您会发现查询不再有效。
我仍然是 linq to sql 的初学者,但看起来它正在将所有本地人作为参考传递。这导致查询在评估查询时仅具有局部变量的值。在 LINQ to SQL 中,我的查询最终看起来像
SELECT * FROM INDEX ONE, INDEX TWO, INDEX THREE
WHERE ONE.ID = 'Jim' and TWO.ID = 'Jim' and
TWO.SEQUENCE = ONE.SEQUENCE + 2 and
THREE.ID = 'Jim' and
THREE.SEQUENCE = ONE.SEQUENCE + 2 and
ONE.GROUP == TWO.GROUP and ONE.GROUP == THREE.GROUP
查询当然是转述的。到底发生了什么,这是一个错误吗?我要求也许更好地理解为什么会发生这种情况。您应该会在 Visual Studio 2008 中找到编译好的代码。
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
namespace BreakLINQ
{
class Program
{
public struct DataForTest
{
private int _sequence;
private string _ID;
private string _group;
public int Sequence
{
get
{
return _sequence;
}
set
{
_sequence = value;
}
}
public string ID
{
get
{
return _ID;
}
set
{
_ID = value;
}
}
public string Group
{
get
{
return _group;
}
set
{
_group = value;
}
}
}
static void Main(string[] args)
{
List<DataForTest> elements = new List<DataForTest>
{
new DataForTest() { Sequence = 0, ID = "John", Group="Bored" },
new DataForTest() { Sequence = 1, ID = "Joe", Group="Bored" },
new DataForTest() { Sequence = 2, ID = "Jeff", Group="Bored" },
new DataForTest() { Sequence = 3, ID = "Jim", Group="Bored" },
new DataForTest() { Sequence = 1, ID = "Jim", Group="Happy" },
new DataForTest() { Sequence = 2, ID = "Jack", Group="Happy" },
new DataForTest() { Sequence = 3, ID = "Joe", Group="Happy" },
new DataForTest() { Sequence = 1, ID = "John", Group="Sad" },
new DataForTest() { Sequence = 2, ID = "Jeff", Group="Sad" },
new DataForTest() { Sequence = 3, ID = "Jack", Group="Sad" }
};
string[] order = new string[] { "Joe", "Jeff", "Jim" };
int sequenceID = 0;
var query = from item in elements
select item;
foreach (string keyword in order)
{
if (sequenceID == 0)
{
string localKeyword = keyword;
query = from item in query
where item.ID == localKeyword
select item;
}
else
{
string localKeyword = keyword;
int localSequence = sequenceID;
query = from item in query
where (from secondItem in elements
where secondItem.Sequence == item.Sequence + localSequence &&
secondItem.ID == localKeyword
select secondItem.Group).Contains(item.Group)
select item;
}
sequenceID++;
}
}
}
}
代码完成后查询的值应该是 {"Joe", "Bored", 1}。
【问题讨论】:
-
作为一个挑剔的人,您使用 System.Linq;两次。
-
我在您的代码中看不到任何 LINQ to SQL 内容。那只是对象的 LINQ。顺便说一句:stackoverflow.com/questions/1095707/…
标签: c# linq linq-to-sql