使用编译的查询加速Linq到Sql

时间:2013-12-18 07:50:11

标签: c# asp.net linq-to-sql

我已经在我的项目中将linq应用于sql并且花了很多时间所以我进行了搜索以使其快速进行搜索并从here

获取参考

我的.cs代码是

public static Func<DataClassesDataContext, int, IQueryable<editor_j_inf>>
editordetail1 = CompiledQuery.Compile((DataClassesDataContext db, int a) =>
                 from p1 in db.editor_j_infs
                 where p1.ed_journal_id == a
                 orderby p1.editor_id descending
                 select p1);   //Its my precompile process

public void editordetail()
{
    DataClassesDataContext db = new DataClassesDataContext();
    var rr = editordetail1(db,Convert.ToInt32(Server.HtmlEncode(Request.Cookies["j_id"].Value)));
    if (rr.Count() != 0)
    {
        txt_jtitle.Text = rr.First().j_title;
        txtissn_p.Text = rr.First().issn_p;           
    }        
}

但错误是enter image description here

2 个答案:

答案 0 :(得分:3)

这一行:

editordetail1(db,Convert.ToInt32(Server.HtmlEncode(Request.Cookies["j_id"].Value)));

可以返回 IEnumerable<T> 。当您在Count()中致电rr.Count()时,您就会列举结果。

这就是为什么当你在下面调用First()时,你试图第二次枚举。

txt_jtitle.Text = rr.First().j_title;

尝试将您的返回值从函数editordetail1转换为List:

var rr = editordetail1(db,Convert.ToInt32(Server.HtmlEncode(Request.Cookies["j_id"].Value)));
var rrList = rr.ToList();

现在使用List上的Count属性,然后调用First()

if (rrList.Count() != 0) // use the List rrList
    {
        txt_jtitle.Text = rr.First().j_title; 
        txtissn_p.Text = rr.First().issn_p;           
    } 

答案 1 :(得分:0)

您需要更改以下行:

var rr = editordetail1(db,Convert.ToInt32(Server.HtmlEncode(Request.Cookies["j_id"].Value)));
if (rr.Count() != 0)

为:

var rr = editordetail1.Invoke(db,Convert.ToInt32(Server.HtmlEncode(Request.Cookies["j_id"].Value))).FirstOrDefault();
if (rr != null)