为什么我的对象被丢弃了?

时间:2017-12-20 05:11:58

标签: c# sql asp.net linq

我正在尝试在asp.net框架中使用带有c#的LINQ访问SQL服务器。 我正在网页上写一个简单的登录表单。以下是我的c#代码,用于检查它是否在数据库中。

public int getUserId(string un, string pw)
    {
        IEnumerable<int> query;
        using (var context = new IngredientsLinqDataContext())
        {
            query = from c in context.USERs
                        where c.Username == un && c.Password == pw
                        select c.UserID;
        }
        if(query.Count() >= 1)
        {
            return query.Min();//a very serious kludge. Need to fix this
        }
        else { return -1; }

    }
}

在检查查询计数是否大于或等于1时,抛出了对象处置异常。我曾经想过,因为查询是在花括号之外声明的,所以这不应该是范围问题。 此外,什么是修复kludge的好方法?它应该只返回一个int,而不是一个int列表。我怎么能这样对待它?谢谢!

5 个答案:

答案 0 :(得分:3)

更改

query = from c in context.USERs
        where c.Username == un && c.Password == pw
        select c.UserID;

query = (from c in context.USERs
        where c.Username == un && c.Password == pw
        select c.UserID).ToList();

LINQ使用延迟执行,因此您不会立即评估查询,但仅在query.Count()评估它。那时的context已经处理好了。这就是你收到错误的原因。

答案 1 :(得分:1)

context被处置,因为您正试图从context使用块中检索数据库中的数据;

    using (var context = new IngredientsLinqDataContext())
    {
        query = from c in context.USERs
            where c.Username == un && c.Password == pw
            select c.UserID;
        if (query.Count() >= 1)
        {
            return query.Min();//a very serious kludge. Need to fix this
        }
        else { return -1; }
    }

答案 2 :(得分:1)

您必须知道Linq查询可以是AsEnumerableAsQueryable

如果您的查询为AsEnumerable,则其中包含访问查询中元素所需的所有信息:您可以要求序列中的第一个元素(如果有),并且一旦获得你可以要求下一个元素(如果有的话)。如果您的查询在您的流程中使用其他功能,则它具有访问这些其他功能的所有信息。简而言之:AsEnumerable在本地内存中处理。

如果您的查询为AsQueryable,则其中包含ExpressionProviderProvider知道指定哪个进程来处理Expression。它知道此进程使用的语言。 Provider的任务是将Expression转换为目标处理器的语言并将其发送到此处理器。

对于Entity Framework,这通常是SQL或MySQL等数据库,但它也可以是电子表格或CSV文件。关于DbContext的好处是,您不需要知道它用于与其他进程通信的语言。您可以使用相同的IDbSet类与完全不同的进程进行通信。

因此IQueryable不包含枚举查询中元素的信息。它只知道如何将其翻译成指定进程的语言以及要求执行此查询的人员。

在您要求元素之前,不会进行翻译和执行。这意味着您必须保留查询使用的提供对象,直到您不再需要此提供对象的任何更多结果。

只要您要求的函数不使用延迟执行,就会执行查询(如每个linq函数的备注部分所述)。这些是ToList(),FirstOrDefault(),Single(),Count()等函数。

WhereSelectGroupBy等功能以及其他使用延期执行的功能只会更改Expression

  

<强>结论
  确保您之前已从提供商处获取了所需的所有数据   你Dispose()它

答案 3 :(得分:0)

可能会解决您的问题。

enter code here System.out: ===pids1 System.out: ==database record[ProductBean{id='', title='ddd', color='dff', size='Select Size', type='Shart', cost='ddf', imagesList=null System.out: ===pids2 System.out: ==database record[ProductBean{id='', title='aa', color='aa', size='Select Size', type='Select Type', cost='aa', imagesList=null}]

答案 4 :(得分:-1)

在此构造中使用tsc file.ts -w // watches for file changes and converts on save 指示query在对数据库执行实际查询之前等待访问对象。在这种情况下,LINQ会在query块之外访问,这就是您收到错误的原因。

试试这个:

using