2012-02-17 72 views
1

这LINQ正常工作:选择类(变量),而不是选择新类{变量= X} Linq中

 return (from page in db.WebPages 
       where pageids.Contains(page.page_id) 
       select new Result 
       { 
        a = page.a, 
        b = page.b 
       }); 

不过,我愿做这样的事情不工作:

return (from page in db.WebPages select GetResult(page)); 


    public Result GetResult(WebPage page) 
    { 
     return new Result 
       { 
        a = page.a, 
        b = page.b 
       }; 

    } 

这给Linq提供了一个没有支持转换的错误。

我想这样做的原因是因为结果更复杂,并且代码执行了很多次,因此避免在每个linq select new {}子句中编写相同的内容。

+0

LINQ-to? SQL,实体...? – Jay 2012-02-17 17:10:13

+0

您正在使用哪个Linq提供程序?这显然不是对象。 Linq到SQL,实体框架... – CodesInChaos 2012-02-17 17:10:56

+0

是linq到sql – 2012-02-17 17:13:38

回答

1

尝试类似如下:

private static IQueryable<Result> toResults(IQueryable<WebPage> query) 
{ 
    return query.Select(item => new Result 
    { 
    //... 
    } 
} 

用法:

return toResults(db.WebPages); 

组织他们喜欢这工作对我来说与其他查询提供的,虽然我没有工作与Linq到SQL个人。

+0

您可以举一个如何使用这个功能的例子。我没有完全理解 – 2012-02-17 17:37:04

+0

更新了一个简单的用法。您可以将它作为实例化或静态的,具体取决于您要放置的位置。如果你想要的话,你也可以制定一个扩展方法(不知道你希望它有多广泛的使用)。 – Servy 2012-02-17 17:44:25

+0

工程就像一个魅力。谢谢 :) – 2012-02-17 18:11:35

1

您正试图在数据库范围内执行方法GetResult()。 Linq to Sql/Entities被转换为SQL查询,您的方法将无法工作。你将不得不去的办法。或者你可以强制使用AsEnumerable()您的查询的LINQ到对象的后期执行:

return (from page in db.WebPages 
     where pageids.Contains(page.page_id)).AsEnumerable() 
     .Select(GetResult); 
+0

是的,但是在方法A中,select new子句中有大约20行,整个linq语句重复了很多次。所以当我想在选择新条款中改变某些东西时,我必须每隔一段时间做一些不合逻辑的事情。必须有一种方法将函数传递给返回适当对象的select。 – 2012-02-17 17:15:23

+1

@MarwanRoushdy:使用'AsEnumerable()'添加了一个替代方案 - 这有一个缺点,即您正在实现所有列值,但请注意这一点。 – BrokenGlass 2012-02-17 17:16:27

+0

我不能使用linq来对象,因为我需要它到sql。该函数内的代码确实转换为SQL,因为它已在选项A – 2012-02-17 17:37:35

1

试试这个?

return db.WebPages.Where(x=> x.Contains(page.page_id).Select(x => GetResult(x));

+0

同样的问题方法'TagThis.Models.Result GetResult(TagThis.Models.WebPage)'没有支持转换到SQL。 – 2012-02-17 17:42:21