SQL 语句到 linq lambda
Posted
技术标签:
【中文标题】SQL 语句到 linq lambda【英文标题】:SQL statement to linq lambda 【发布时间】:2013-06-11 08:06:30 【问题描述】:我有这个 sql 语句:Select FileURL from story where ActivityID = ' "listACt" ' ;
如何将其转换为 linq lambda?
我有这个,但它不工作:
public IList<Model.story> GetActivityList(int listAct)
IList<Model.story> lstImages = context.stories.ToList();
return lstImages.Where(c => c.ActivityID == listAct).ToList().Select( a => a.FileURL).ToList();
错误显示:无法隐式转换类型'System.Collections.Generic.List<string>' to 'System.Collections.Generic.IList<iStellarMobile.Model.story>'
。存在显式转换(您是否缺少演员表?)
编辑---------------
protected void btnSort_Click(object sender, EventArgs e)
if (dropListActivity.SelectedIndex > 0)
gvStory.DataSource = daoStory.GetActivityList(Convert.ToInt32(dropListActivity.SelectedItem.Value));
else
gvStory.DataBind();
使用 SWeko 的第二个代码后上述代码出错:
以下方法或属性之间的调用不明确:'iStellarMobile.DAO.DAOStory.GetActivityList(int)' 和 'iStellarMobile.DAO.DAOStory.GetActivityList(int)'
【问题讨论】:
返回List<Model.story>
两个同名同签名的方法真的有歧义吗?顺便说一句,如果gvStory
是一个应该显示故事的 GridView,你可能需要我的第一个代码,而不是第二个。
【参考方案1】:
@SWeko 已经涵盖了您看到的第一个错误,但您应该注意,如果您希望将“SQL 语句转换为 linq lambda”,您的查询可能不会按照您的预期进行。假设context
是一个实体框架上下文或类似的,这个:
IList<Model.story> lstImages = context.stories.ToList();
return lstImages
.Where(c => c.ActivityID == listAct)
.Select(a => a.FileURL)
.ToList();
...执行一条 SQL 语句,从第一行的 stories
表中选择所有内容,然后使用 Linq-to-objects 在内存中执行您的 lambda。考虑将其更改为:
return context.stories
.Where(c => c.ActivityID == listAct)
.Select(a => a.FileURL)
.ToList();
...这将导致您的 lambda 转换为与您之后的语句匹配的 SQL(Select FileURL from story where ActivityID = ' " listACt " ')。
对于您的第二个错误,编译器说您有两个具有相同签名的方法 - iStellarMobile.DAO.DAOStory.GetActivityList(int)
- 找到这两个并更改一个,使它们不同。
【讨论】:
【参考方案2】:您声明您将返回一个 (i) 故事列表,但您返回的是一个 FileURL 列表,根据错误消息,它是一个字符串列表。
你可以这样做
public IList<Model.story> GetActivityList(int listAct)
IList<Model.story> lstImages = context.stories.ToList();
return lstImages.Where(c => c.ActivityID == listAct).ToList();
或
public IList<string> GetActivityList(int listAct)
IList<Model.story> lstImages = context.stories.ToList();
return lstImages.Where(c => c.ActivityID == listAct)
.Select( a => a.FileURL)
.ToList();
【讨论】:
ActivityID 字段是一个 int 列 好吧,比这行得通,问题文本中有很多引号,这让我很失望。 查看我的编辑,我试过你的代码,它在 CRUD 类方面没有显示错误。但是 aspx.cs 端有错误。以上是关于SQL 语句到 linq lambda的主要内容,如果未能解决你的问题,请参考以下文章
LINQ体验(18)——LINQ to SQL语句之视图和继承支持