0

我拥有的是一个数据库,其中大多数表键都是 Guid 的。问题是,如果我尝试执行 LINQ to Entity 语句并将我可用的 Guid 与我正在引用的实体之一中存在的 Guid 进行比较,则 SQL 永远不会运行!我已经使用运行 SQL Profiler 的 SQL Server 2008 R2 对此进行了测试,并且在执行该语句时,该 sql 显然从未对数据库进行过处理。如果我取出 Guid 比较,则将 sql 传递给 SQL Server 并返回结果。

例如:

var itemType = new Guid("27733204-C1E6-4F93-BEAD-63C2C8EBC299");
var items from myDBContext.Items.Where(x => x.itemType == itemType);

我尝试了其他方法,例如 x.itemType.CompareTo(itemType) 但没有任何效果。基本上,如果我有一个 Guid,我想在 linq 语句本身范围之外的任何类型的 Where 子句中使用,我绝对不会向服务器发出 SQL。

我希望有人能给出一些答案。当前使用 Entity Framework 5 和 C# 4.5。

4

2 回答 2

1
 If I take out the Guid comparison, then the sql is passed to SQL Server and I get a result back.

根据描述,您更改的任何代码都会导致查询立即执行。LINQ 方法支持延迟执行。延迟执行基本上意味着在需要结果之前不会执行查询。通常,返回序列的方法使用延迟执行。

Where()是一种使用延迟执行的方法。 Single()/SingleOrDefault()立即执行。换句话说,后一种类型的方法会立即执行,因此即使不迭代结果也会导致 SQL 流量在分析器中可见。

            IEnumerable<Catalog> result;
            Catalog result2;
            using (var context = new ExampleEntities())
            {
                var itemType = new Guid("E8110BDE-8433-4C49-BA9A-034DEA2FA20E");
                result = context.Items.Where(x => x.ItemID == itemType);//deferred
                result2 = context.Items.First();//immediate

                //The foreach code below causes the deferred query to execute.
                if (result != null)
                {
                    foreach (var catalog in result)
                    {
                        Console.WriteLine("{0}, {1}", catalog.ItemID, catalog.ModifiedDate);
                    }
                }
            }     
于 2013-08-27T21:37:01.293 回答
-1

尝试以下

// Create a sample item
var itemType = new Guid("27733204-C1E6-4F93-BEAD-63C2C8EBC299"); 

// Create a holder for the value of ItemType.
// EF will not be able to translate itemType.ToString()
// to SQL if you try to call it directly.
var itemTypeValue = itemType.ToString();

// Execute your query 
// I placed ToList() to force the
// execution.  You can use anything
// that will cause the query to enumerate.
var items from myDBContext.Items.Where(x => x.itemType == itemTypeValue).ToList(); 
于 2013-08-27T21:21:20.860 回答